matlab实现视频图像去噪完成篇
通过上一章节的学习相信大家已经掌握了一些小的技巧 
 在看本章节之前你应该掌握以下技能
- 给按钮添加回调函数
 - 修改axes框和按钮的属性,包括tag属性和string属性
 - 你要可以打开gui编程的界面
 
如果不会以上技能的童鞋请看上一章节的内容 
 https://blog.csdn.net/gjggj/article/details/79115121 
 现在正式实现这个项目: 
 首先拖出一个下图的界面: 
  
 第一个axses框的tag属性改为before第二个axses框的属性改为after 
 去噪按钮的string属性改为“去噪”,tag属性改为load 
 下一张按钮的string属性改为“下一个”,tag属性改为next 
 上一张按钮的string属性改为“上一个”,tag属性改为prev
第二步 
 在matlab保存脚本的文件夹,一般是bin目录里新建两个空文件夹,分别是new和old; 
 程序运行结束后new保存了去噪后的视频和每一帧的图像,old保存了去噪后的视频和每一帧的图像
第三步 
 相应的按钮添加回调函数如下:
去噪按钮的回调函数
function load_Callback(hObject, eventdata, handles)
% hObject    handle to load (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
[filename,pathname]=uigetfile({'*.*';'*.avi';'*.mp4';'*.flv';},'选择视频');
%将im定义成全局变量,这样在代码的任何位置都可以使用im了。
%如果没有输入路径,则弹出错误对话框
if isequal(filename,0)||isequal(pathname,0)
    errordlg('您还没有选择视频!!','程序员哥哥告诉你');
    return;
else
    %合成路径+文件名
    global PA;
    global im;
    path=[pathname,filename];
    PA=path;
    %读取图像
    videoRead = VideoReader(PA);
    %打开坐标,方便操作
    nFrameRead = videoRead.NumberOfFrames;% 帧的总数
    for i = 1 : nFrameRead;   %对每帧图像做空间域滤波处理
        %命名 jpg默认为YCbCr通道
        strtemp = strcat('old//F_new',int2str(i),'.','jpg');
        F_new = read(videoRead,i);
        %  F_new=medfilt2(F)
        imwrite(F_new,strtemp,'JPG');       % 将图片序列保存为图片文件
    end
    videoRead = VideoReader(path);
    %打开坐标,方便操作
    nFrameRead = videoRead.NumberOfFrames;% 帧的总数
    for i = 1 : nFrameRead;   %对每帧图像做空间域滤波处理
        %命名 jpg默认为YCbCr通道
        strtemp = strcat('new//F_new',int2str(i),'.','jpg');
        F = read(videoRead,i);
        %  F_new=medfilt2(F)
        %   F_new = imnoise(F,'speckle',0.1); %给图像加入噪声 0.4为可以修改的参数
        Y = F(:,:,1);                       %获得图像的三个通道的灰度值
        Cb = F(:,:,2);
        Cr = F(:,:,3);
        F_Y=medfilt2(Y,[3 3]);             %对图像进行中值滤波处理
        F_Cb=medfilt2(Cb,[3 3]);
        F_Cr=medfilt2(Cr,[3 3]);
        F_new = cat(3,F_Y,F_Cb,F_Cr);      %将三个通道联结在一起 cat函数
        imwrite(F_new,strtemp,'JPG');       % 将图片序列保存为图片文件
    end
end
myobj = VideoWriter('new//result.avi');     % 新建一个视频文件
myobj.FrameRate =25;               % 定义每秒的帧数
open(myobj);                           % 打开视频文件
for i = 1:nFrameRead;                  % 将图像重新生成视频文件
    fname = strcat('new//F_new',num2str(i),'.jpg');
    im = imread(fname);
    writeVideo(myobj,im);
end 
下一个按钮的回调函数:
function next_Callback(hObject, eventdata, handles)
% hObject    handle to next (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
persistent j;
if isempty(j)
    j=0;
end
global i;
i=j;
j=j+2;
fname = strcat('old//F_new',num2str(j),'.jpg');
im = imread(fname);
set(handles.before,'HandleVisibility','ON');
%使用图像,操作在坐标before里
axes(handles.before);
%在坐标图before里显示原图像
imshow(im);
fname = strcat('new//F_new',num2str(j),'.jpg');
af = imread(fname);
set(handles.after,'HandleVisibility','ON');
%使用图像,操作在坐标before里
axes(handles.after);
%在坐标图before里显示原图像
imshow(af); 
上一个按钮的回调函数:
function prev_Callback(hObject, eventdata, handles)
% hObject    handle to prev (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
persistent j;
global i;
if isempty(j)
    j=i;
end
j=j-2;
if j<=0
    j=1;
end
fname = strcat('old//F_new',num2str(j),'.jpg');
im = imread(fname);
set(handles.before,'HandleVisibility','ON');
%使用图像,操作在坐标before里
axes(handles.before);
%在坐标图before里显示原图像
imshow(im);
fname = strcat('new//F_new',num2str(j),'.jpg');
af = imread(fname);
set(handles.after,'HandleVisibility','ON');
%使用图像,操作在坐标before里
axes(handles.after);
%在坐标图before里显示原图像
imshow(af);
 
恭喜你完成本项目,如有其它问题请在下面留言与我交流 
 留个思考题,如何做到上面两个axses框是每一帧图片的对比,下面是去噪前后两个视频的对比?(下一篇博客揭晓答案) 
 如下图: 
 
                    
                
                
            
        
浙公网安备 33010602011771号