daanzhijia

通过上一章节的学习相信大家已经掌握了一些小的技巧
在看本章节之前你应该掌握以下技能

  1. 给按钮添加回调函数
  2. 修改axes框和按钮的属性,包括tag属性和string属性
  3. 你要可以打开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框是每一帧图片的对比,下面是去噪前后两个视频的对比?(下一篇博客揭晓答案)
如下图:
这里写图片描述

分类:

技术点:

相关文章:

  • 2021-11-30
  • 2021-11-11
  • 2021-07-08
  • 2022-12-23
  • 2021-12-23
  • 2021-05-25
  • 2021-04-06
  • 2021-05-18
猜你喜欢
  • 2021-04-23
  • 2022-02-07
  • 2022-12-23
  • 2021-11-20
  • 2021-11-10
  • 2021-11-20
  • 2022-12-23
相关资源
相似解决方案