基于MATLAB的数字图像处理仿真平台
一、课题实现功能
学习MATLAB GUI程序设计,利用MATLAB图像处理工具箱,设计和实现自己的Photoshop 。要求:按照软件工程方法,根据需求进行程序的功能分析和界面设计,给出设计详细说明。然后按照自己拟定的功能要求进行程序设计和调试。
整个系统要完成的基本功能大致如下:
4、数字图像由RGB转换成HIS空间并分别显示其分量图。
5、数字图像分割功能:
六、具体设计
6.1.1、打开
为了让使用者更方便的使用,所以在设计的时候,通过对话框的形式来选择文件,选择uigetfile函数来实现,uigetfile函数显示一个打开文件对话框,该对话框自动列出当前路径下的目录和文件,由于这个GUI程序的操作对象是图像文件。
Uigetfile函数的调用格式为[name,path]=yigetfile(…), 在按下对话框中的执行按钮“打开”后,返回选择的文件名和路径,分别保存到“ name”和“path”中。如果按下取消按钮或是发生错误,则返回值是0。 根据返回值的情况,如果是0,则弹出提示错误的对话框,否则,通过imread函数读出图像数据,把图像数据赋值给全局变量handles.image。
6.1.2、保存
同样也通过对话框的形式来保存图像数据,通过uigetfile函数选择文件名和路径,用getimage(gca)取出坐标2变换后的图像数据保存到变量i,最后用imwrite函数,把数据i存到指定的文件。
6.1.4、退出
退出比较简单,程序如下所示:
clc;
close all;
close(gcf);
6.1.3、打印
打印功能没能实现,将它设置为不可使用,可用如下代码实现
set(handles.print, 'Enable','off' ); %放在open_callback函数末尾
set(handles.print, 'Enable','off' );%放在two_OpeningFcn中
6.2.1、R直方图
由于RGB图像是三维图像,所以图像数据是一个三维数组,为了显示R直方图像,把三维图像降为二维,且是当最后一个参数为1时是R直方图:
x=imhist(handles.image(:,:,1)); %当然也可以选择(:,:,2) 或(:,:,3)
imshow(y);
处理前后图片效果如下:
6.2.2、G直方图
G直方图与R直方图的程序差不多只需将数值为1的R直方图变成2即可成为G直方图
x=imhist(handles.image(:,:,2));
6.2.3、B直方图
同理可得B直方图
x=imhist(handles.image(:,:,3));
RGB三种直方图统计图如下:
原图 R直方图
G直方图 B直方图
6.3.1、直方图均衡化
在balance_Callback回退函数中实现直方图均衡化
每个回退函数中都要获取图片,上面的RGB直方图也一样需获取打开的图片。打开图片的为以下程序代码:
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
直方图均衡化是判断是否为灰度图。用函数isrgb了来判断,不是灰度则将其转化,否则就直接用函数:
histeq(handles.image)% handles.image是获取的图片
来直方图均衡化处理图片
图片前后效果如下:
6.3.2、 对比度展宽
对图像的对比度展宽刻可自己编写算法来处理,同样的,,处理结果如图:
6.3.3、动态范围调整
共图像处理功能未能实现,程序中已给出处理其图像的代码,但有错误,不能找出其错位,将其正确的处理,
原因是:nw=1./(b-a).*(h-a.*ones(sx,sy));
Error:Matrix dimensions must agree
也查过资料修改该语句,有的资料说是乘除和幂方要改成点乘点除,点幂方,这个是合理,但是改正后仍然有错,是在无能为力,
代码在后面将给出,可供参考。
6.3.4、空间域平滑算法
6.3.4.1、均值滤波
经常用到的噪声有两种,高斯噪声,椒盐噪声,可以通过以下两个函数来实现:
y=imnoise(handles.img,'gaussian',p1,p2);%高斯噪声
y=imnoise(x,'salt & pepper',p1); %椒盐噪声
均值滤波中可对高斯滤波,也可以对椒盐滤波,设计过程中采用其一种图片进行处理。但两种处理的效果就不同,对高斯噪声处理的效果更加明显
均值滤波是一种采取平均灰度值的方法进行滤波,用imnoise获得噪声的图片。这个函数可获得高斯噪声,亦可获得椒盐噪声。在采用函数conv2进行均值处理,处理前后的图片比较如下:
6.3.4.2、中值滤波
中值滤波同均值滤波的程序差不多,只是进行滤波的原理不同,则采用不同的函数进行代替,用以下函数可进行中值滤波处理:
I = imnoise(handles.image,'salt & pepper', 0.02);
imshow(I);
j=medfilt2(I);
前后图片效果如下:
6.3.4.3、边界保持滤波
原理不同,采用knn函数是处理边界保持滤波的,程序代码的形式跟前两种滤波差不多:
I = imnoise(handles.image,'salt & pepper', 0.02);
imshow(I);
j=knn2(I);
前后图片效果如下:
图象分割是按照某些特性(如灰度级,频谱,颜色,纹理等)将图象划分成一些区域,在这些区域内其特性是相同的或者说是均匀的,两个相邻区域彼此特性则是不同的,其间存在着边缘或边界
6.4.1、均匀性度量法
当图像被分为目标物和背景两个类时,属于同一类别的像素值分布方差最小,也即具有均匀性。
给定一初始阈值Th=Th0,将图像分为C1和C2两类
分别计算两类中的方差
分别计算两类在图像中的分布概率
选择最佳阈值 Th=Th*, 将图像分为C1和C2两类,满足
均匀性度量方法的处理结果:
6.4.2、类间最大距离法.
采用最佳阈值分割后,两类之间的差异最大,且差异采用两类中心与阈值间的距离差度量
给定一初始阈值Th=Th0,将图像分为C1和C2两类
分别计算两类的灰度均值
计算相对距离度量值 s
选择最佳阈值 Th=Th*, 将图像分为C1和C2两类
图片效果:
6.4.3、局部阈值法
不均匀照射,物体背景对比明显, 不能只使用一门限
灰度级校正。
图象分成小块,选择局部门限
局部阈值法的处理前后结果:
6.5、 颜色空间转化
6..5.1、RGB转HSV
色彩空间相互转化:
其中有很多种色彩空间,这里只介绍两种转换关系:
RGB转HSV,图像处理中有专门的函数将其进行转化,即rgb2hvs函数
转化图像前后对比如下:
6.5.2、RGB转HIS
首先获取图像的 RGB 3个通道
R=w(:,:,1);
G=w(:,:,2);
B=w(:,:,3);
观察HSI通道图像
因系统没有rgb2hsi函数,只有rgb2hsv函数,可自己编写程序实现算法
,用一个循环处理,分别得到HIS的色度,饱和度以及强度图,代码在后面实现
图形处理效果如下:
6.6、 其他图像处理功能
6.6.1、锐化
6.6.2、傅里叶
这两个是附加的图像处理功能,在次不做过多的说明,可向大家看看处理图像结果进行对比一下,看看效果,可在后面附上代码
锐化. 四种傅里叶变
三、源码
function varargout = two(varargin)
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @two_OpeningFcn, ...
'gui_OutputFcn', @two_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before erzhi is made visible.
function two_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
---------------------------------------------------------
%接下来是菜单的程序
---------------------------------------------------------
function file_Callback(hObject, eventdata, handles)
--------------------------------------------------------
%文件打开程序
function open_Callback(hObject, eventdata, handles)
[name,path]=uigetfile({'*.bmp'},'载入图像');
if isequal(name,0)|isequal(path,0)
errordlg('没有选中文件','出错');
return;
else
x=imread([path,name]);
axes(handles.axes1);
imshow(x);
handles.img=x;
handles.noise_img=x;
guidata(hObject,handles)
end
---------------------------------------------------
function save_Callback(hObject, eventdata, handles)
%文件保存
[filename,pathname] = uiputfile('*.bmp','图片保存为');
if isequal([filename,pathname],[0,0])
errordlg('没有保存','出错');
return;
else
file=strcat(pathname,filename);
(handles.axes2);
i=getimage(gca);
imwrite(i,file);
end
-----------------------------------------------------
function exit_Callback(hObject, eventdata, handles)
clc;
close all;
close(gcf);
---------------------------------------------------------
% 直方图
------------------------------------------------------
function zhf_Callback(hObject, eventdata, handles)
-------------------------------------------------
function red_Callback(hObject, eventdata, handles)
% R直方图
data (see GUIDATA)
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
x=imhist(handles.image(:,:,1));
x1=x(1:10:256);
horz=1:10:256;
bar(horz,x1);
set(handles.axes2,'xtick',0:50:255); ------------------------------------------------------
function green_Callback(hObject, eventdata, handles)
% G直方图
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
x=imhist(handles.image(:,:,2));
x1=x(1:10:256);
horz=1:10:256;
bar(horz,x1);
set(handles.axes2,'xtick',0:50:255);
------------------------------------------------------
function blue_Callback(hObject, eventdata, handles)
% B直方图
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
%if isrgb(handles.img)
x=imhist(handles.image(:,:,3));
x1=x(1:10:256);
horz=1:10:256;
bar(horz,x1);
set(handles.axes2,'xtick',0:50:255);
-----------------------------------------------------
%图像增强处理
---------------------------------------------------------
function zhf_Callback(hObject, eventdata, handles)
-------------------------------------------------
function balance_Callback(hObject, eventdata, handles)
%直方图均衡化
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
if isrgb(handles.image)
a=histeq(handles.image(:,:,1));
b=histeq(handles.image(:,:,2));
c=histeq(handles.image(:,:,3));
k(:,:,1)=a;
k(:,:,2)=b;
k(:,:,3)=c;
imshow(k);
else
h=histeq(handles.image);
imshow(h);
end
function zq_Callback(hObject, eventdata, handles)
-----------------------------------------------------------------
function duibidu_Callback(hObject, eventdata, handles)
%对比度展宽
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
h=im2double(handles.image);
[sx,sy]=size(h);
nw=h.^0.3;
subplot(2,2,1);
imshow(h);
title('original');
subplot(2,2,2);
imshow(nw);
title('r=0.4');
subplot(2,2,3);
imshow(h.^0.5);
title('r=0.7');
subplot(2,2,4);
imshow(h.^2);
title('r=3');
--------------------------------------------------------------------
function dongtai_Callback(hObject, eventdata, handles)
%动态调整范围
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
h=im2double(handles.image);
a=0.01;
b=0.35;
[sx,sy]=size(h);
[w,n]=find(h(:)<=a);
h(n)=0;
[w1,n1]=find(h(:)>b);
h(n1)=1;
nw=1./(b-a).*(h-a.*ones(sx,sy));
subplot(1,2,1);
imshow(h);
subplot(1,2,2);
imshow(nw);
-----------------------------------------------------------------
%空间域平滑算法
function pinghua_Callback(hObject, eventdata, handles)
-----------------------------------------------------------------
function junzhi_Callback(hObject, eventdata, handles)
%均值滤波
h=[1 1 1;1 1 1;1 1 1];
h=h/9;
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
x=imnoise(handles.image,'gaussian',0,0.02);
imshow(x);
j=conv2(x,h);
figure,imshow(j,[]);
--------------------------------------------------------------------
function zhongzhi_Callback(hObject, eventdata, handles)
%中值滤波
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
% I=imnoise(I,'gaussian',0,0.02);
I = imnoise(handles.image,'salt & pepper', 0.02);%
j=medfilt2(I);
figure,imshow(j,[]);
--------------------------------------------------------------------
function bianjie_Callback(hObject, eventdata, handles)
% 边界保持滤波
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
% I=imnoise(I,'gaussian',0,0.02);
I = imnoise(handles.image,'salt & pepper', 0.02);
imshow(I);
j=knn2(I);
figure,imshow(j,[]);
-----------------------------------------------------------------
--------------------------------------------------------------------
function junyunxing_Callback(hObject, eventdata, handles)
%均与性度量法
set(handles.axes2,'HandleVisibility','ON');
axes(handles.axes2);
v=double(handles.image);
[sx,sy]=size(v);
num=sx*sy;
t=[];
for th=6:254
[r1,c1]=find(v(:)>=th);
[r2,c2]=find(v(:)
if(length(r1)~=0 & length(c1)~=0 )
L1=v(r1);
else
L1=[];
end
if(length(r2)~=0 & length(c2)~=0 )
L2=v(r2);
else
L2=[];
end
m1=mean(L1(:)); m2=mean(L2(:));
Var1=sum((L1(:)-m1).^2);Var2=sum((L2(:)-m2).^2);
Var1=var(L1(:));Var2=var(L2(:));
P1=length(L1(:))/num;
P2=length(L2(:))/num;
t=[t,P1*Var1+P2*Var2];
end
[c,l]=min(t);
B=v;
[r1,c1]=find(v(:)>=l+5);
[r2,c2]=find(v(:) B(r1)=255; B(r2)=0; imshow(uint8(B)); % -------------------------------------------------------------------- function jubuyuzhi_Callback(hObject, eventdata, handles) %局部阈值法 set(handles.axes2,'HandleVisibility','ON'); axes(handles.axes2); v=rgb2gray(handles.image); imshow(v); R=zeros(size(v)); H = FSPECIAL('gaussian',9,2.4); v = imfilter(v,H); t=graythresh(v); t=t*255; [c,l]=find( v(:)>t); R(c)=1; [x,y]=size(R); q=R; for i=10:x-10 for j=10:y-10 if R(i,j)==0 t=[R(i-1,j-1),R(i-1,j),R(i-1,j+1),R(i,j-1),R(i,j+1),R(i+1,j-1),R(i+1,j),R(i+1,j+1)]; if sum(t)==0 q(i,j)=1; end end end end figure, imshow(q,[]); -------------------------------------------------------------------- function leijianzuidajuli_Callback(hObject, eventdata, handles) %类间最大法 set(handles.axes2,'HandleVisibility','ON'); axes(handles.axes2); X=rgb2gray(handles.image); [r,c]=size(X); figure (1) subplot(1,2,1) imshow(X) R=zeros(1,256); for i=50:150 Xi0=X0<=i; N0=sum(sum(Xi0)); Xm0=X0(Xi0); u0=sum(Xm0)/N0; Xi1=X0>i; N1=sum(sum(Xi1)); Xm1=X0(Xi1); u1=sum(Xm1)/N1; R(i+1)=(u1-i)*(i-u0)/((u1-u0)^2); end Th=find(R==max(R(51:151)))-1 X2=zeros(r,c); for i=1:r for j=1:c X2(i,j)=X0(i,j)>Th; end end subplot(2,2,2) imshow(X2) ----------------------------------------------------------------- %颜色空间转化 -------------------------------------------------------------------- function hsv_Callback(hObject, eventdata, handles) %RGB转HSV set(handles.axes2,'HandleVisibility','ON'); axes(handles.axes2); hv=rgb2hsv(handles.image); subplot(2,2,1); imshow(hv); title('RGBHSV'); %RGB=reshape(ones(64,1)*reshape(jet(64),1,192),[64,64,3]); H=hv(:,:,1); S=hv(:,:,2); V=hv(:,:,3); subplot(2,2,2); imshow(H) ; title('§§'); subplot(2,2,3); imshow(S); title('§§'); subplot(2,2,4); imshow(V); title('§§'); -------------------------------------------------------------------- function HIS_Callback(hObject, eventdata, handles) %RGB转HSI set(handles.axes2,'HandleVisibility','ON'); axes(handles.axes2); W=im2double(handles.image);%获得double型的图形矩阵 [m,n,q]=size(W); R=W(:,:,1); G=W(:,:,2); B=W(:,:,3); % 改变通道来观察图像 H=zeros(m,n); S=H; for i1=1:m for i2=1:n numerator=0.5*(R(i1,i2)-G(i1,i2)+R(i1,i2)-B(i1,i2)); denominator=sqrt((R(i1,i2)-G(i1,i2))^2+(R(i1,i2)-B(i1,i2))*(G(i1,i2)-B(i1,i2))); theta=acos(numerator/denominator)*180/pi; if(B(i1,i2)<=G(i1,i2)) H(i1,i2)=theta; else H(i1,i2)=360-theta; end min1=min(R(i1,i2),G(i1,i2)); min1=min(B(i1,i2),min1); S(i1,i2)=1-3/(R(i1,i2)+G(i1,i2)+B(i1,i2))*min1; end end I=(R+G+B)/3; figure,subplot(1,3,1),imshow(H,[]),title('色度图H'); set(gcf,'outerposition',get(0,'screensize')); set(gcf,'NumberTitle','off','Name','HSI通道图像'); subplot(1,2,2),imshow(S),title('饱和度图S'); subplot(1,2,3),imshow(I),title('强度图I'); % ----------------------------------------------------------------- %其他图像处理 --------------------------------------------------------------------------- function fly_Callback(hObject, eventdata, handles) %傅里叶变化 set(handles.axes2,'HandleVisibility','ON'); axes(handles.axes2); [m,n]=size(handles.image); d=zeros(m,n); d(60:100,60:100)=1; w=fft2(d); w1=fftshift(w); [sx,sy]=size(d); subplot(2,2,1); imshow(d); subplot(2,2,2); imshow(abs(w1)); for i=1:sx t= fft(d(i,:)); len=length(t)/2; F1(i,:)=[(t(len+1:end)),t(1:len)]; end for i=1:sy F2=fft(F1(:,i)); len=length(F2)/2; F(:,i)=[(F2(len+1:end));F2(1:len)]; end subplot(2,2,3); imshow(abs(F1)); subplot(2,2,4); imshow((abs(F))); function ruihua_Callback(hObject, eventdata, handles) %锐化 k=2; h1=[-1 0 1;-k 0 k;-1 0 1]; h2=[1 k 1;0 0 0;-1 -k -1]; set(handles.axes2,'HandleVisibility','ON'); axes(handles.axes2); I=rgb2gray(handles.image); subplot(121);imshow(I); J1(:,:)=conv2(I(:,:),h1); J2(:,:)=conv2(I(:,:),h2); J=abs(J1)+abs(J2); subplot(122); imshow((J),[0 255]);你可能感兴趣的:(python,opencv,java,计算机视觉,matlab)