您的位置:首页 > 编程语言 > MATLAB

用matlab实现视频的空间滤波和直方图均衡化

2016-10-19 16:26 483 查看
一、实验题目
1、读取一个AVI视频
2、将视频转换成图片序列
3、对每帧图片进行空间滤波以及直方图均衡化
4、生成新的视频
二.实验目的
深刻理解matlab对视频处理的模式;
学习并且运用空间滤波和直方图均衡化的方法。
三、实验内容
1. 实验原理
读取相应路径中的视频,并读取每一帧并且保存下来。对每一帧的三个通道分别进行空间滤波,再对三个通道对应矩阵进行直方图均衡化,再把三个通道分别赋进新矩阵的3个通道即可,最后将处理后的每一帧的图片分别写入新的视频文件即可。
其中matlab都给我们封装好了空间滤波和直方图均衡化的函数,我们只需要调用即可。
而空间滤波是指通过对周围的像素点进行比较,确定中心像素点的信值。这一方法可以有效去除冲击噪声。比较典型的空间滤波有均值滤波,中值滤波。
直方图均衡化则是将对应图像的灰度值进行处理使其各个像素点都尽可能地分布在不同的灰度级,并且概率密度尽可能相等。这一处理的直观结果是使得图片对比度变大。而在这个含噪声的视频中,这一处理同时也加强了噪声,从而使视频加上了雪花。
2. 实验步骤
利用matlab中的VideoReader函数读取相应路径中的视频文件,并利用NumberOfFrames获取该视频的总共帧数。videoRead = VideoReader('C:\.....\newfile.avi');
nFrameRead = videoRead.NumberOfFrames;然后读取每一帧并且将图像数据写入到图像文件中,存储在磁盘上,matlab中的imwrite函数即可以做到这个效果:for i = 1 :1 :nFrameRead
    %%int2str把整形转换成字符串的形式, 转换后可以使用fprintf或disp函数进行输出。
    strtemp = strcat('F_new',int2str(i),'.','jpg');%%% Strings Catenate横向连接字符串。
    F = read(videoRead,i);
        %函数功能:将图像数据写入到图像文件中, 存储在磁盘上。
        %imwrite(A,filename,fmt):A是图像数据,filename是目标图像名字,fmt是要生成的图片的格式。
    imwrite(F,strtemp,'JPG');
end接下来,我们即可以对每一帧图像进行处理:strtemp = strcat('F_new',int2str(i),'.','jpg');
f = imread(strtemp);
X = f(:,:,1);
Y = f(:,:,2);
Z = f(:,:,3);
H = fspecial('average',[3 3]);%%均值滤波
x = imfilter(X, H, 'replicate');%%图像大小通过扩大外边界的值来扩展
y = imfilter(Y, H, 'replicate');
z = imfilter(Z, H, 'replicate');X,y,z分别为图片3个通道分别进行均值滤波之后的3个通道的矩阵。
再分别对3个通道进行直方图均衡化:
 r = histeq(x);
g = histeq(y);
b = histeq(z);
生成新的图片矩阵,并写入图像文件。last_rgb(:,:,1)=r;
last_rgb(:,:,2)=g;
last_rgb(:,:,3)=b;
imwrite(last_rgb,strtemp,'JPG');最后生成一个新的视频,并且将每帧的图片写入新视频文件,即生成了处理过后的视频myObj = VideoWriter('newfile_1.avi');
writerObj.FrameRate = 30;
open(myObj);
for i = 1 :nFrameRead
fname = strcat('F_new',num2str(i),'.jpg');
frame = imread(fname);
writeVideo(myObj,frame);
end
四、实验结果
 原视频图像:



 
均值滤波后:



 
直方图均衡化后:



 
作为对比,我们再添加一个直方图均衡化的对比样例:



 
实现代码:img = imread('C:\Users\abc\lena.png');
subplot(121);imshow(img);title('原图');
x = img(:,:,1);
y = img(:,:,2);
z = img(:,:,3);
r = histeq(x);
g = histeq(y);
b = histeq(z);
last(:,:,1)=r;
last(:,:,2)=g;
last(:,:,3)=b;
subplot(122);imshow(last);title('直方图均衡化后');
 
 
五、实验感想
本次实验确确实实地让我开阔了眼界。首先,从这次实验中,加深了maltab对视频处理的理解。就如我们一直都知道,视频处理其实就是图片的处理,视频的每一帧就是图片,而通过这次实验,发现原来matlab可以利用图片去生成一个视频,这是非常有用的技术。未来或许可以不用一些视频剪辑软件而可以自己实现视频剪辑。其次,对于图像的处理,在这次实验中主要运用了空间滤波和直方图均衡化。虽然Matlab中直接给我们封装好了这样方便的函数便于使用,但是背后却有一番大学问。这2种图像处理方法都是由当初的理论推导而来的。我们只有在见证了这些理论的实际效果之后,才会感叹理论的威力。足以见证理论在实际数字图像处理等IT领域的威力。比如在直方图均衡化时,是经历一番关于概率密度等的数学推导才发现可以一系列的处理方式可以使得各个灰度级的概率密度趋近相同,从而增强对比度。也说明了一点,数学作为计算机的辅助手段,与IT行业是密不可分的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: