图像灰度变化程序设计Word格式文档下载.docx
《图像灰度变化程序设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《图像灰度变化程序设计Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
图像处理技术的主要内容包括图像压缩,增强和复原,匹配、描述和识别3个部分。
常见的处理有图像数字化、图像编码、图像增强、图像复原、图像分割和图像分析等。
图像处理一般指数字图像处理。
灰度变换主要针对独立的像素点进行处理,通过改变原始图像数据所占有的灰度范围而使图像在视觉上得到改观,没有利用像素点之间的相互关系。
因此,灰度变换处理方法也叫点运算。
点运算是一种既简单又重要的技术,一幅输入图像经过点运算后将产生一幅新的输出图像,由输入像素点的灰度值决定相应的输入像素点的灰度值。
二、算法分析与描述
2.1对比度扩展
对比度:
通俗地讲,就是亮暗的对比程度。
设有一幅图,由于成象时光照不足,使得整幅图偏暗,(灰度范围从0到63);
或者成象时光照过强,使得整幅图偏亮,(灰度范围从200到255),我们称这些情况为低对比度,即灰度都挤在一起,没有拉开。
灰度扩展的意度的目的,图2-1说明对比度扩展的原理思就是把你所感兴趣的灰度范围拉开,使得该范围内的像素,亮的越亮,暗的越暗,从而达到了增强对比度的目的。
我们可以用图2-1来说明对比度扩展的原理。
图2-1
对比度扩展的原理
图2.1中的横坐标gold表示原图的灰度值,纵坐标gnew表示gold经过对比度扩展后得到了新的灰度值。
a,b,c为三段直线的斜率,因为是对比度扩展,所以斜率b>
1。
g1old和g2old表示原图中要进行对比度扩展的范围,g1new和g2new表示对应的新值。
用公式表示为
显然要得到对比度扩展后的灰度,我们需要知道a,b,c,g1old,g2old五个参数。
由于有新图的灰度级别也是255这个约束,所以满足ag1old+b(gold-g1old)+c(255-g2old)=255这个方程。
这样,我们只需给出四个参数,而另一个可以代入方程求得。
我们假设a=c,这样,我们只要给出b,g1old和g2old,就可以求出
a=(255-b(g2old-g1old))/(255-(g2old-g1old))
要注意的是,给出的三个参数必须满:
(1)b*(g2old-g1old)<
=255;
(2)(g2old-g1old)<
=255。
2.2灰级窗处理
灰级窗也称为灰度窗口,灰级窗可以看作是对比度扩展的一个特例,它是将某一区间的灰度级和其它部分(背景)分开,只显示指定灰度级范围内的信息。
灰级窗的原理如图2-2所示
g
图2-2
灰级窗的原理
不难看出,只要令比度扩展中的α=γ=0就实现了灰级窗。
我们只要给出范围的两个端点,斜率β就可以用方程β(b-a)=255求出,灰级窗的原理和对比度扩展的原理类似。
2.3直方图均衡
直方图均衡化处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
是对在图像中像素个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减。
从而达到清晰图像的目的。
直方图均衡化(平滑化)是一种最常用的直方图修正,它是把给定图像的直方图分布改造成均匀直方图分布。
直方图均衡化导致图像的对比度增加。
由信息学的理论来解释,具有最大熵(信息量)的图像为均衡化图像。
直观地讲,直方图均衡化一方面要求尽量扩展灰度的分布域;
另一方面更重要的是努力使每一个灰度级上的频度尽可能一致。
频度趋于一致的图像使人感觉色调沉稳、安定,意味着图像质量“好”。
三、详细设计过程
3.1层次图
图3-1层次图
3.2对比度线性展宽详细设计
具体实现形式为:
g(x,y)=(d-c)/(b-a)[f(x,y)-a]+c
作用:
使曝光不充分图像中黑的更黑,白得更白,从而提高图像对比度
I=imread('
123.bmp'
);
%读入图片
[d1,d2,d3]=size(I);
if(d3>
1)
I=rgb2gray(I);
%如果是灰度图就不用先变换
end
I=double(I)/255;
I1=uint8(255*I*0.5+0.5);
imshow(I1);
imwrite(I,'
test.jpg'
)%显示展宽后的图片
3.3灰级窗详细设计
clearall;
closeall;
fa=45;
fb=160;
I=imread('
imshow(I);
I=rgb2gray(I);
figure;
[m,n]=size(I);
J=double(I);
k2=255/(fb-fa);
fori=1:
m
forj=1:
n
ifI(i,j)<
fa
J(i,j)=0;
elseifI(i,j)<
fb
J(i,j)=k2*(I(i,j)-fa);
else
end
end
figure;
imshow(J);
3.4直方图均衡化处理详细设计
img=imread('
p=rgb2gray(img);
h=imhist(p);
h1=h(1:
2:
256);
h2=1:
256;
stem(h2,h1,'
r--'
figure,imhist(p);
四、调试过程中出现的问题及相应解决办法
1.本软件大多数功能实现是针对二值图像,如果输入图像为RGB图像如:
腐蚀,膨胀将无法处理显示,请先进行RGB图像转二值图像操作后再进行其他处理,图像在进行二值转换时要注意阙值的大小,以便使得图片的效果最佳。
2.其次是图片的路径问题,首先得找到图片所在的位置,否则会显示错误。
3.调试过程中要注意Tag的属性设置和String的属性,正确赋值,防止错误运。
五、程序运行截图及其说明
1.打开文件
图5.1
2.打开图片后如图5.2
图5.2
3.点击图像处理下的对比度扩展
图5.3
4.点击图像处理下的灰级窗处理
图5.4
5.点击图像处理下的直方均衡化
图5.5
6.点击文件目录下的保存进行保存
图5.6
六、简单操作手册
如果装有matlab软件直接双击导入相应函数之后,点击“回车”键程序,实现相应的功能。
运行程序出现界面:
图6.1开始界面
点击文件,再点击打开,选择原图:
点击图像处理,选择灰级窗/对比度线性展宽/直方均衡化
图6.3
图6.4
图6.5
点击文件,选择保存,保存图像
图6.7
设计总结
通过本次课程设计,使我对《计算机图像处理》这门课程有了更深入的理解。
《计算机图像处理》是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。
一个人的力量是有限的,要想把课程设计做的更好,就要学会参考一定的资料,吸取别人的经验,让自己和别人的思想有机的结合起来,得出属于你自己的灵感。
程序的编写需要有耐心,有些事情看起来很复杂,但问题需要一点一点去解决,分析问题,把问题一个一个划分,划分成小块以后就逐个去解决。
再总体解决大的问题。
这样做起来不仅有条理也使问题得到了轻松的解决。
在这个过程中,我也曾经因为实践经验的缺乏失落过,也曾经仿真成功而热情高涨。
生活就是这样,汗水预示着结果也见证着收获。
劳动是人类生存生活永恒不变的话题。
虽然这只是一次的极简单的课程制作,可是平心而论,也耗费了我不少的心血,这就让我不得不佩服开发技术的前辈,才意识到老一辈对我们社会的付出,为了人们的生活更美好,他们为我们社会所付出多少心血啊!
对我而言,知识上的收获重要,精神上的丰收更加可喜。
让我知道了学无止境的道理。
我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。
挫折是一份财富,经历是一份拥有。
这次课程设计必将成为我人生旅途上一个非常美好的回忆!
通过这次的课程设计我对于专业课的学习有了更加深刻的认识,以为现在学的知识用不上就加以怠慢,等到想用的时候却发现自己的学习原来是那么的不扎实。
以后努力学好每门专业课,让自己拥有更多的知识,才能解决更多的问题!
参考资料
[1]张力,VisualC++高级编程,人民邮电出版社,2002
[2]何斌,马天予,王运坚,红莲等编著,VisualC++数字图像处理,人民邮电出版社,2002
[3]白乔,左飞,把脉VisualC++,电子工业出版社,2009
[4]章毓晋.图像处理和分析基础[M].北京:
高等教育出版社.2002.
[5]钟志光,鲁君,刘伟荣.VC++.NET数字图像处理实例与解析[M].清华大学出版社,2003.
[6]汪翔袁辉,VisualC++实践与提高,中国铁道出版社,2001
致谢
首先感谢我的指导老师徐志刚老师,她在我的综合训练过程中提出了指导性的方案和架构,并指引我阅读相关的资料和书籍,使我在不熟悉的领域中仍能迅速掌握新的技术。
感谢我的计算机图像处理老师徐志刚老师和在以往的基础课学习中为我打下良好的基础,这是我这次综合训练能够顺利完成的前提。
还有我的同学,在设计过程与完成后对程序的测试,没有他们,也许就难以发现一些潜在的错误,在此一并表示感谢。
附录
functionvarargout=untitled(varargin)
%UNTITLEDM-fileforuntitled.fig
%UNTITLED,byitself,createsanewUNTITLEDorraisestheexisting
%singleton*.
%
%H=UNTITLEDreturnsthehandletoanewUNTITLEDorthehandleto
%theexistingsingleton*.
%UNTITLED('
CALLBACK'
hObject,eventData,handles,...)callsthelocal
%functionnamedCALLBACKinUNTITLED.Mwiththegiveninputarguments.
Property'
'
Value'
...)createsanewUNTITLEDorraisesthe
%existingsingleton*.Startingfromtheleft,propertyvaluepairsare
%appliedtotheGUIbeforeuntitled_OpeningFunctiongetscalled.An
%unrecognizedpropertynameorinvalidvaluemakespropertyapplication
%stop.Allinputsarepassedtountitled_OpeningFcnviavarargin.
%*SeeGUIOptionsonGUIDE'
sToolsmenu.Choose"
GUIallowsonlyone
%instancetorun(singleton)"
.
%Seealso:
GUIDE,GUIDATA,GUIHANDLES
%Edittheabovetexttomodifytheresponsetohelpuntitled
%LastModifiedbyGUIDEv2.509-Jan-201311:
18:
34
%Begininitializationcode-DONOTEDIT
gui_Singleton=1;
gui_State=struct('
gui_Name'
mfilename,...
'
gui_Singleton'
gui_Singleton,...
gui_OpeningFcn'
@untitled_OpeningFcn,...
gui_OutputFcn'
@untitled_OutputFcn,...
gui_LayoutFcn'
[],...
gui_Callback'
[]);
ifnargin&
&
ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
%Endinitializationcode-DONOTEDIT
%---Executesjustbeforeuntitledismadevisible.
functionuntitled_OpeningFcn(hObject,eventdata,handles,varargin)
%Thisfunctionhasnooutputargs,seeOutputFcn.
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%varargincommandlineargumentstountitled(seeVARARGIN)
%Choosedefaultcommandlineoutputforuntitled
handles.output=hObject;
%Updatehandlesstructure
guidata(hObject,handles);
%UIWAITmakesuntitledwaitforuserresponse(seeUIRESUME)
%uiwait(handles.figure_pj);
%---Outputsfromthisfunctionarereturnedtothecommandline.
functionvarargout=untitled_OutputFcn(hObject,eventdata,handles)
%varargoutcellarrayforreturningoutputargs(seeVARARGOUT);
%Getdefaultcommandlineoutputfromhandlesstructure
varargout{1}=handles.output;
%--------------------------------------------------------------------
functionm_file_open_Callback(hObject,eventdata,handles)
%hObjecthandletom_file_open(seeGCBO)
[filename,pathname]=uigetfile(...
{'
*.bmp;
*.jpg;
*.png;
*.jpeg'
'
ImageFiles(*.bmp,*.jpg,*.png,*.jpeg)'
;
...
*.*'
AllFiles(*.*)'
},...
Pickanimage'
ifisequal(filename,0)||isequal(pathname,0),
return;
axes(handles.axes_src);
fpath=[pathnamefilename];
img_src=imread(fpath);
imshow(img_src);
setappdata(handles.figure_pj,'
img_src'
img_src);
functionm_file_save_Callback(hObject,eventdata,handles)
%hObjecthandletom_file_save(seeGCBO)
[filename,pathname]=uiputfile({'
*.bmp'
BMPfiles'
'
JPGfiles'
},'
PickanImage'
ifisequal(filename,0)||isequal(pathname,0)
%如果点了“取消”
else
fpath=fullfile(pathname,filename);
%获得全路径的另一种方法
img_src=getappdata(handles.figure_pj,'
%取得打开图片的数据
imwrite(img_src,fpath);
%保存图片
functionm_file_exit_Callback(hObject,eventdata,handles)
%hObjecthandletom_file_exit(seeGCBO)
close(handles.figure_pj);
functionm_file_Callback(hObject,eventdata,handles)
%hObjecthandletom_file(seeGCBO)
functionm_image_Callback(hObject,eventdata,handles)
%hObjecthandletom_image(seeGCBO)
functionm_image_hj_Callback(hObject,eventdata,handles)
%hObjecthandletom_image_hj(seeGCBO)
img_src=rgb2gray(img_src);
[m,n]=size(img_src);
J=do