matlab实现视频图像去噪完成篇

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

  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框是每一帧图片的对比,下面是去噪前后两个视频的对比?(下一篇博客揭晓答案)
如下图:
这里写图片描述

转载于:https://www.cnblogs.com/readlearn/p/10806403.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值