前言:本文类似于学习笔记,所以有疑问或者有什么宝贵的建议欢迎在下方留言。(注:本文代码大部分可从《数字图像处理 第三版》中找到)
使用软件: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结构元素膨胀图片');
(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