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

news/2024/6/17 22:01:11 标签: 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保存了去噪后的视频和每一帧的图像

第三步
相应的按钮添加回调函数如下:

去噪按钮的回调函数

matlab">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

下一个按钮的回调函数:

matlab">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);

上一个按钮的回调函数:

matlab">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


http://www.niftyadmin.cn/n/1588910.html

相关文章

【Eelectron-vue】构建桌面应用(16)-electron窗口大小设置

在使用electron进行桌面开发时&#xff0c;会随着业务的需要动态的改变窗口的大小&#xff0c;比如从登陆窗口跳转到主页面的时候需要去改变大小&#xff0c;退出登陆的时候也需要改变大小。发现在使用setSize去设置大小的时候&#xff0c;会出现有的时候可以改变大小&#xff…

WM_COMMAND产生的条件

2019独角兽企业重金招聘Python工程师标准>>> 1 #include<windows.h> #include "allmenu.h" #include<iostream> using namespace std; HMENU hmenu; HMENU haddmenu;//窗口函数 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wPar…

【Eelectron-vue】构建桌面应用(17)-electron托盘图标的徽标

1.前言 在windows系统中&#xff0c;一般的应用都会监听不同的状态&#xff0c;然后给出不同的提示。比如QQ的离线状态&#xff0c;企鹅会变灰。当网络中断时&#xff0c;会一直在左右摇摆&#xff0c;类似于等待重连&#xff0c;并且后台都做了重连的操作。 基于这种情况&am…

exchange 中继

exchange2003升级到exchange2007Exchange2003 垃圾邮件***常见问题解决两则1&#xff0e; 中继服务器肉鸡有的朋友在Exchange2003的邮件队列中常常发现有这样的邮件&#xff0c;发件人和收件人的都不是自己的邮件域&#xff0c;很明显这种情况说明别人用你的邮件服务器做中继服…

【Eelectron-vue】构建桌面应用(18)-electron打包应用时托盘图标错误

今天打算打成安装包发给测试部门做集成测试&#xff0c;本想偷个懒直接打包交给测试&#xff0c;但是大意失荆州。测试拿到安装文件&#xff0c;安装后执行程序&#xff0c;直接报错&#xff0c;程序直接就奔溃了&#xff0c;错误信息如下&#xff1a; 看到错误的时候也是蒙了…

页面div居中定位

在编写很多时候页面的时候我们都需要布局居中对齐的&#xff0c;这里引用一个小案例讲解一下水平垂直居中对齐预期效果 实现过程 html代码&#xff1a; <body> <div class"main"> <div class"input-username div-input"><div class&q…

论坛教程-去除版块导航

为什么80%的码农都做不了架构师&#xff1f;>>> 效果预览 修改方法 转载于:https://my.oschina.net/lunhui/blog/284708

第二十五课 grep\egrep工具的使用

一、什么是正则 正则就是一串有规律的字符串。掌握好正则对于编写shell有很大帮助&#xff01;&#xff01;&#xff01; 二、grep、egrep工具 1&#xff64;命令格式&#xff1a;grep -cinvrABC word filename c 行数i 不区分大小写 -c 打印符合要求的行数 grep -c nologin /e…