通过上一章节的学习相信大家已经掌握了一些小的技巧
在看本章节之前你应该掌握以下技能
- 给按钮添加回调函数
- 修改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框是每一帧图片的对比,下面是去噪前后两个视频的对比?(下一篇博客揭晓答案)
如下图: