本文主要是介绍给YUV视频加入椒盐噪声,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
你可以按帧读入yuv视频。然后每帧图像加入椒盐噪声,然后按帧保存成yuv视频就可以了啊。 %对YUV格式文件信息按帧读入并进行下采样后保存 %注:此次处理的YUV文件的Y、U、V分量是分开处理的。但读入时是按4:2:2比例处理的 %对yuv文件存储时候使用的是平面格式而不是打包格式 function YUVSubsample(filename,frameNumMax,formatT,method,outputFileName) clc; clear; %考虑到调用函数时未输入参数,则赋以默认参数值 if nargin==0frameNumMax = 16; %读取的yuv的帧数:考虑到上采样的问题,此处应比最后输出的视频帧多一帧formatT = 'cif'; %yuv格式文件类型method = 'paper'; %yuv文件的下采样方法filename = 'coast_cif.yuv';%yuv格式文件名outputFileName = 'salt_pepper_coast_cif.yuv'; %yuv文件下采样后以另外一个名字保存 end % 初始化帧格式 switch formatTcase 'qcif'H = 144; % 高W = 176; % 宽case 'cif'H = 288; % 高W = 352; % 宽otherwiseH = 480; % 高W = 720; % 宽 end%按帧读入yuv文件并按帧处理后保存为yuv格式的文件 for frameNum = 1:frameNumMax% 读取yuv格式某指定帧的文件内容[Y U V]为读入的某帧的原始数据[Y,U,V]=yuv_import(filename,[W,H],1,frameNum);% 按指定下采样方法进行下采样处理:[YI UI VI]为下采样后的数据%在此处对加入椒盐噪声处理Y = imnoise(uint8(Y),'salt & pepper',0.005);U = imnoise(uint8(U),'salt & pepper',0.005);V = imnoise(uint8(V),'salt & pepper',0.005);%分别显示Y、U、V分量subplot(1,3,1),imshow(uint8(Y));subplot(1,3,2),imshow(uint8(U));subplot(1,3,3),imshow(uint8(V));%将下采样后的[YI UI VI]数据输出,保存为指定文件名的yuv格式yuv_output(outputFileName,Y,U,V,1,frameNum);%播放每帧图像时暂停1/1000spause(1/1000); end%读取yuv格式某指定帧的文件内容[Y U V]为读入的某帧的原始数据:实际上yuv的某帧文件就是一幅图片 function [Y,U,V]=yuv_import(filename,dims,numfrm,startfrm)%以只读的方式打开并关联文件fid=fopen(filename,'r');if (fid < 0)error('File does not exist!');end;%计算每帧文件的大小,计算读取某指定帧的文件偏移位置Yd = zeros(dims(1),dims(2));UVd = zeros(dims(1)/2,dims(2)/2); %UV分量的位置frelem = numel(Yd) + 2*numel(UVd); %视频图像显示的宽度if (nargin == 4) %从文件起始位置计算偏移量fseek(fid, startfrm * frelem , 0);end;%初始化Y、U、V分量,YUV文件格式为:4:2:2Y=zeros(dims(2),dims(1),numfrm);U=zeros(dims(2)/2,dims(1)/2,numfrm);V=zeros(dims(2)/2,dims(1)/2,numfrm);%分别读入YUV分量for i=1:numfrmYd = fread(fid,[dims(1) dims(2)],'uint8'); Y = Yd'; %转置UVd = fread(fid,[dims(1)/2 dims(2)/2],'uint8');U = UVd'; %转置UVd = fread(fid,[dims(1)/2 dims(2)/2],'uint8');V = UVd'; %转置end;%关闭文件并去掉关联fclose(fid);%将下采样后的[YI UI VI]数据输出,保存为指定文件名的yuv格式 function yuv_output(outputFileName,YI,UI,VI,numfrm,startfrm)%判断是否是第一帧即刚开始输入。如果是第一次输入则将原有同名文件覆盖否则在文件后追加信息if startfrm==1fileId=fopen(outputFileName,'w');elsefileId=fopen(outputFileName,'a');endif (fileId < 0)error('File does not exist!');end;%[YI UI VI]数据取下整YI = round(YI);UI = round(UI);VI = round(VI);%计算每个分量大小,计算每帧图像输出时文件的偏移位置Yd = size(YI); %Y分量的位置Ud = size(UI); %U分量的位置Vd = size(VI); %V分量的位置frelem = Yd(1)*Yd(2) + Ud(1)*Ud(2) + Vd(1)*Vd(2); %视频图像显示的宽度if (nargin == 4)%从文件起始位置计算偏移量fseek(fid, startfrm * frelem , 0);end;%输出YI,UI,VI分量信息fwrite(fileId, YI', 'uint8');fwrite(fileId, UI', 'uint8');fwrite(fileId, VI', 'uint8');%关闭文件并去掉关联fclose(fileId);
这篇关于给YUV视频加入椒盐噪声的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!