技术标签: matlab python java 计算机视觉 opencv
基于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(:)<th);
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(:)<l+5);
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]);
windows下安装使用Maven
前言: 开发异常千变万化,总有那么一些看似困难,实则简单的异常,也是容易被忽视的小问题!往往不经意间就会使系统报错,导致无法正常运行!错误日志:FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. C:\Tomcat6.0\temp\
为什么80%的码农都做不了架构师?>>> ...
http://www.yunnan.cn 发布时间 2012-08-04 15:16:47 星期六 来源:云南网 大中小昆工获一等奖云南网讯 (记者 自建丽)8月4日,2012年(第五届)中国大学生计算机设计大赛(云南赛区)决赛在云南师范大学落下帷幕。我省昆明理工大学提交作品《西双版纳傣族地区希望小学建设模式探究》获得此次比赛一等奖。据介绍,2012年(第五届)中国大学生计算机设计大赛首次在云南省...
[email protected]:/# service ssh [email protected]:/# sudo net start sshdsudo: net:找不到命令[email protected]:/# sudo ufw disable防火墙在系统启动时自动禁用[email protected]:/# ssh localhostWelcome to Ubun
用了vi两年,因为不用vi写代码作开发,只是简单的修改配置文件而已,因此,呵呵,两年了还是一点不熟悉。最近因为公司要求需要学习在linux/unix上开发c/c++,只好努力学一下vi/vim了。找了一本书,O'Reilly的Learning The VI Editor,chm的电子版本,认真地学了一遍,总结了一下常用命令:文件操作vi +n file 打开文件并移动到第n行vi + fi...
新人学习手机 App 开发,一开始总要选择一条学习路径。如果你熟悉 Java 语言,可以学习安卓开发;如果熟悉脚本语言(比如 Python 或 Ruby),可以学习 Swift 语言,进行 iOS 开发;如果像我一样,比较熟悉 Web 网页技术,那么 H5 开发是最容易上手的。这个系列教程的第一篇,已经介绍过了手机 App 的种类。所谓的 H5 页面,其实就是混合 App 的前端,外面...
一、行内元素和块级元素的区别 1、 行内元素不会占据整行,在一条直线上排列,都是同一行,水平方向排列; 块级元素会占据一行,垂直方向排列。 2、 块级元素可以包含行内元素和块级元素;行内元素不能包含块级元素。 3、 行内元素与块级元素属性的不同,主要是盒模型属性上,行内元素设置width无效,height无效(可以设置line-height),margin上下无效,pa...
1.新建一个QT项目,然后选中项目名称,之后点击菜单栏的 项目-属性。2.然后点击VC++目录-包含目录,再.点击右边的下三角按钮,接着点击 “编辑”。3.设置包含目录。点击上面最左边的“新建一行”的图标,接着点击 右边的“浏览”按钮将QT的包含目录添加进来。再点击确定。4.同样的方法添加库目录。5.最后可以看到包含目录和库目录都已经设置
一 :简介开发中经常会设计到excel的处理,如导出Excel,导入Excel到数据库中,操作Excel目前有两个框架,一个是apache 的poi, 另一个是 Java Excel Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel、WORD、PowerPoint、...
说说 Windows 脚本宿主运行的几种方式 1.在命令提示符下运行脚本 使用 Windows 脚本宿主,可以在命令提示符下运行脚本。CScript.exe 提供了用于设置脚本属性的命令行开关。 使用 CScript.exe 运行脚本 用下列语法在命令提示符下键入命令: cscript [host options...][script name] [script opti
index.jsp<% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";%>