数字图像处理Matlab

2021年11月9日 3点热度 0条评论 来源: HeyinB

前言:本文类似于学习笔记,所以有疑问或者有什么宝贵的建议欢迎在下方留言。(注:本文代码大部分可从《数字图像处理 第三版》中找到

使用软件:MATLAB R2018a

参考资料:《数字图像处理 第三版》,CSDN博客

使用初音图片P站画师uid:1589657。

最终实现效果:(下图)

 

 

正文内容

    打开matlab后输入guide后弹出选择界面,新建一个GUI界面

在左边选择自己需要按钮在界面中展出后,右键该按钮选择查看回调→Callback打开后会自动跳转到该按钮的代码块,只要在定位到的function pushbutton1_Callback代码下写要实现的功能就可以了。

下面直接展示相关代码功能:

(1)导入图片

[file path]=uigetfile('*.bmp;*.jpg;*.png','请选择一幅图像');
if file==0 warndlg('您得输入一幅图像');
%警告对话框提示输入合法图像文件
else
    I=imread(fullfile(path,file));
    axes(handles.axes1);
    imshow(I);title('原图像');
    handles.I=I;
end
%Update handles structure
guidata(hObject,handles);

(2)清除图片和文本框内容

%清除视图图片
cla(handles.axes2,'reset');  %handles.axes2为显示图片窗口,reset即清除
% 重置清空动态txt的文字
set(handles.edit1,'string','');  %handles.edit1为要清除文字的文本框(双击文本框可以看见tag)

(3)关闭程序

close

(4)平移(用文本框实现输入数字进行平移图像)

        ①先创建一个可编辑文本框(输入水平平移的位移),然后给他添加代码

%获取text文本框的数字,竖直平移X的数值
global x;%定义一个x的全局变量
x=str2num(get(hObject,'String'));

        ②先创建一个可编辑文本框(输入竖直平移的位移),然后给他添加代码

%获取text文本框的数字,竖直平移Y的数值
global y;
y=str2num(get(hObject,'String'));

        ③创建一个button,给他添加代码

global y;
global x;
I=handles.I;
axes(handles.axes2);
se=translate(strel(1),[x y]);  
j=imdilate(I,se); 
axes(handles.axes2);
imshow(j);title('竖直平移后图像');

    在X和Y的文本框中输入数值,点击button后就能使图像平移了(如输入X:260;Y:90)

 

 

(5)旋转

 

%图像的旋转
I=handles.I;
a=str2num(get(hObject,'String'));
J1=imrotate(I, a);   %设置旋转角度,实现旋转并显示
axes(handles.axes2);
imshow(J1);title('旋转后图像');
guidata(hObject,handles);

(6)镜像

%用下拉列表实现水平镜像,垂直镜像,水平垂直镜像
switch get(hObject,'value')   %实现下拉列表需要写改语法
case 1
       
case 2
         I=handles.I;
        J1=flipdim(I,2);%原图像的水平镜像
        axes(handles.axes2);
        imshow(J1);title('水平镜像');
        guidata(hObject,handles);
case 3
         I=handles.I;
        J2=flipdim(I,1);%原图像的垂直镜像
        axes(handles.axes2);
        imshow(J2);title('垂直镜像');
        guidata(hObject,handles);
case 4
         I=handles.I;
        J3=flipdim(I,1);%原图像的水平垂直镜像
        J4=flipdim(J3,2);
        axes(handles.axes2);
        imshow(J4);title('水平垂直镜像');
        guidata(hObject,handles);
end

下面就不把全部代码都写出来了,只挑选一部分出来(上面代码几乎能实现每个按钮的用法)

(7)DCT变换

%DCT变换(P58)
I=handles.I;
J=rgb2gray(I);%将图片转变为灰色图像
axes(handles.axes2);
imshow(J);title('原灰图像');
K=dct2(J);%对图像做DCT变换
axes(handles.axes3);
imshow(log(abs(K))+1,[0,10]);title('DCT变换结果');

 

(8)对受椒盐噪声污染的图像采用中值滤波去噪

I=handles.I;
I=rgb2gray(I);%转化为灰度图像
J=imnoise(I,'salt & pepper',0.04);%对图像增加椒盐噪声,强度为0.04
axes(handles.axes2);    %显示在axex2框中
imshow(J); title('受椒盐噪声污染图片');
K=medfilt2(J);          %二维中值滤波
axes(handles.axes3);
imshow(K);title('二维中值滤波处理后的图片');

 

(9)彩色图像增强(分别使用RGB和HSV方法)——用下拉列表实现

switch get(hObject,'value')
    case 1
        
    case 2
        RGB=handles.I;
        R=RGB(:,:,1);
        G=RGB(:,:,2);
        B=RGB(:,:,3);
        R1=histeq(R);
        G1=histeq(G);
        B1=histeq(B);
        RGB1=cat(3,R1,G1,B1);
        axes(handles.axes2);    %显示在axes2框中
        imshow(RGB1);title('RGB增强');
    case 3
        RGB=handles.I;
        R=RGB(:,:,1);
        G=RGB(:,:,2);
        B=RGB(:,:,3);
        R1=histeq(R);
        G1=histeq(G);
        B1=histeq(B);
        RGB1=cat(3,R1,G1,B1);
        [H,S,V]=rgb2hsv(R,G,B);
        V=histeq(V);
        [R2,G2,B2]=hsv2rgb(H,S,V);
        RGB2=cat(3,R2,G2,B2);
        axes(handles.axes2);    %显示在axes2框中
        imshow(RGB2,[]);title('HSV增强');
        C=double(RGB1)./255-RGB2;
        axes(handles.axes3);    %显示在axes3框中
        imshow(C);title('差值图像');
end

RGB增强:

HVS增强:

(10)彩色图像锐化

代码引用了:点击打开链接

I=handles.I;
fb=tofloat(I);  	%将图像转化为浮点型
lapmask=[1 1 1;1 -8 1;1 1 1]; 	%拉普拉斯滤波模板
fen=fb-imfilter(fb,lapmask,'replicate');
axes(handles.axes2);
imshow(fen);title('拉普拉斯锐化');
function [out,revertclass] = tofloat(inputimage)
%Copy the book of Gonzales
identify = @(x) x;
tosingle = @im2single;
table = {'uint8',tosingle,@im2uint8 
         'uint16',tosingle,@im2uint16 
         'logical',tosingle,@logical
         'double',identify,identify
         'single',identify,identify};
classIndex = find(strcmp(class(inputimage),table(:,1)));
if isempty(classIndex)
    error('不支持的图像类型');
end
out = table{classIndex,2}(inputimage);
revertclass = table{classIndex,3};

 

 

 

(10)彩色图像复原

%维纳滤波复原图像
I=handles.I;
len=28;
theta=14;
PSF=fspecial('motion',len,theta);
blurred=imfilter(I,PSF,'circular','conv');%读入无噪声模糊图像,并命名blurred
len=28;
theta=14;
wnrl=deconvwnr(blurred,PSF,0.04);%维纳滤波复原图像
axes(handles.axes2);
imshow(blurred);title('由运动形成模糊图像');%显示模糊图像
axes(handles.axes3);
imshow(wnrl);title('维纳滤波复原图像');%显示复原图像

(11)square膨胀

%用square结构元素膨胀图片(用text文本框比较好)
a=str2num(get(hObject,'String'));
I=handles.I;
se1=strel('square',a);
I1=imerode(I,se1);
axes(handles.axes2);    %显示在axes2框中
imshow(I1);title('用square结构元素膨胀图片');

这里输入了20的数值

(12)边缘检测(使用canny算子)

I=handles.I;
        I=rgb2gray(I);
        BW5=edge(I,'canny');%进行canny算子边缘检测,门限值采用默认值
        axes(handles.axes2);    %显示在axes2框中
        imshow(BW5,[]);title('canny算子');

 

附上源程序:点击打开链接

链接:https://pan.baidu.com/s/1CYnKo5SAdE-Ey6rDD-DEYQ 
提取码:g4a5

    原文作者:HeyinB
    原文地址: https://blog.csdn.net/weixin_40590063/article/details/80725298
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。