图像灰度变化程序.docx
《图像灰度变化程序.docx》由会员分享,可在线阅读,更多相关《图像灰度变化程序.docx(20页珍藏版)》请在冰点文库上搜索。
![图像灰度变化程序.docx](https://file1.bingdoc.com/fileroot1/2023-7/21/03642978-2563-4662-9575-30ba92f8db59/03642978-2563-4662-9575-30ba92f8db591.gif)
图像灰度变化程序
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2012年秋季学期
图像处理综合训练
题目
图像灰度变化程序设计
专业班级:
—
姓名:
学号:
指导教师:
成绩:
摘要0
一、前言1
二、算法分析与描述2...
三、详细设计过程5...
四、调试过程中出现的问题及相应解决办法6.
五、程序运行截图及其说明7...
六、简单操作手册1..3.
设计总结1.4..
参考资料1.5..
致谢1..6..
附录1..7..
摘要
本程序设计主要实现对对比度线性展宽、灰级窗处理和直方图均衡化的处理,从而达到我们所需的要求,进而将其应用到特殊领域。
在图像处理中主要用Matlab编写图像处理程序,并调用Matlab图像处理的部分内部函数进行处理。
关键词:
数字图像处理;Matlab;点运算;直方图均衡化
21世纪是一个信息的时代,图像作为人们感知世界的视觉基础,是人类获取信息、表达信息和传递信息的重要手段。
研究表明,人类获取的视觉图像信息在人类接受的信息中的比重达到3/4,“百闻不如一见”便是非常形象的例子之一。
图像是对客观对象的一种相似性的、生动性的描述或写真。
或者说图像是客观对象的一种表示,它包含了有关被描述对象的信息,它是人们最主要的信息源。
据统计,一个人获取的信息大约有75%来自视觉。
数字图像处理技术是20世界60年代发展起来的一门新兴学科.随着图像处理理论和方法的进一步完善使得数字图像处理技术在各个领域得到了广泛
应用.并显示出广阔的应用前景。
MATLABS是一种直观、高效的计算机语言.同时又是一个科学计算平台。
它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。
根据它提供的500多个数学和工程函
数工程技术人员和科学工作者可以在它的集成环境中交互或变成以完成各自的计算。
MATLAB^集成了功能强大的图像处理工具箱。
由于MATLABS言的语
法特征与C语言极为相似,而且更加简单更加符合科技人员对数学表达式的书写格式而且这种语言可移植性好、可扩展性强再加上其中有丰富的图像
处理函数■所以MATLA在图像处理的应用中具有很大的优势。
灰度变换主要针对独立的像素点进行处理,通过改变原始图像数据所占有的灰度范围而使图像在视觉上得到改观,没有利用像素点之间的相互关系。
因此,灰度变换处理方法也叫点运算。
点运算是一种既简单又重要的技术,一幅输入图像经过点运算后将产生一幅新的输出图像,由输入像素点的灰度值决定相应的输入像素点的灰度值。
、算法分析与描述
2.1对比度扩展
设有一幅图,由于成象时光照不足,使得整幅图偏暗,(灰度范围从0到
63);或者成象时光照过强,使得整幅图偏亮,(灰度范围从200到255)。
我们称这些情况为低对比度,即灰度都挤在一起,没有拉开。
灰度扩展的意思就是把感兴趣的灰度范围拉开,使得该范围内的像素,亮的越亮,暗的越暗,从而达到了增强对比度的目的。
设原图、处理后的结果图的灰度值分别为f(i,j)和g(i,j);要求f(i,j)和g(i,j)均在[0,255]间变化,但是g的表现效果要优于f。
因为f和g的取值范围相同,所以通过抑制不重要的部分,来扩展所关心部分的对比度。
对比度:
通俗地讲,就是亮暗的对比程度。
我们可以用图2-1来说明对比度扩展的原理。
图2-1对比度扩展的原理
图2.1中的横坐标g表示原图的灰度值,纵坐标ga,gb表示g经过对比度扩展后得到了新的灰度值°a,B,丫为三段直线的斜率,因为是对比度扩展,所以斜率B>1。
fa和fb表示原图中要进行对比度扩展的范围,ga和gb表示对应的新值。
用公式表示为
(af(i.j).0«(心〉<人
/?
(/(£>))—/.)十弘»fb
U(/(iO)—/b)+^h»
(i=l,2<*■,nz;J=1,2,,n)
图2-2对比度扩展数学公式
显然要得到对比度扩展后的灰度,我们需要知道a,B,丫,ga,gb五个参数。
由于有新图的灰度级别也是255这个约束,所以满足aga+B(gb-ga)+丫
(255-gb)=255这个方程。
这样,我们只需给出四个参数,而另一个可以代入方程求得。
我们假设a=丫,这样,我们只要给出B,ga和5,就可以求出
a=(255-B(gb-ga))/(255-(gb-ga))
2.2灰级窗处理
灰级窗也称为灰度窗口,灰级窗可以看作是对比度扩展的一个特例,它是将
某一区间的灰度级和其它部分(背景)分开,只显示指定灰度级范围内的信息。
图2-3灰级窗的原理
扩展的原理类似
2.3直方图均衡
直方图均衡化处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
是对在图像中像素个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减。
从而达到清晰图像的目的直方图均衡化(平滑化)是一种最常用的直方图修正,它是把给定图像的直方图分布改造成均匀直方图分布。
直方图均衡化导致图像的对比度增加。
由信息学的理论来解释,具有最大熵(信息量)的图像为均衡化图像。
直观地讲,直方图均衡化一方面要求尽量扩展灰度的分布域;另一方面更重要的是努力使每一个灰度级上的频度尽可能一致。
频度趋于一致的图像使人感觉色调沉稳、安定,意味着图像质量好直方图均衡化方法的具体步骤如下:
1求原图像f(i,j)的灰度直方图,设用256维的向量hj表示;
2由hj求原图的灰度分布概率,记作Pf,则有
其中,Nf=MXN(M,N分别为图像的长和宽)为图像的总像素个数;
3计算图像各个灰度值的累计分布概率,记作pa,则有其中,令pa(0)=0
4进行直方图均衡化计算,得到处理后图像的像素值g(i,j)为:
。
g(八J)=255•pa(k)
三、详细设计过程
3.1层次图
日…
文件
”曰打开
厂曰筋
、“曰退出
卜令加窗处理
-已直方国均衝化显Li京圏
、曰显示原圏
图3-1层次图
3.2打开函数详细设计
fpath=[pathnamefilename];%将文件名和目录名组合成一个完整的路径
img_a1=imread(fpath);
imshow(img_a1);%用imread读入图片,并用imshow在axes_src上显示setappdata(handles.figure_he,'img_a1',img_a1);%完成Callback之间的数
值传递
img_a1=getappdata(handles.figure_he,'img_a1');%和setappdata配套使用,用于在其他函数的Callback中读取数据
set(handles.m」mage,'Enable','on')%实现在打开图片之前不能使用tag为
m_image的功能
3.3对比度线性展宽详细设计
f=rgb2gray(A);先用Matlab自带函数把真彩图像转化成一幅灰度图像,索引图像的颜色映射表转化成灰度颜色映射表
在一个[255,255]矩阵中通过一个for()语句达到线性扩宽的效果
imshow(g);通过imshow函数显示图片
3.4灰级窗详细设计
原理上和对比度线性展宽类同,实现也类同。
f=rgb2gray(A);先用Matlab自带函数把真彩图像转化成一幅灰度图像,索引图像的颜色映射表转化成灰度颜色映射表
在一个[255,255]矩阵中通过一个for()语句达到灰度窗处理的效果
imshow(g);通过imshow函数显示图片
3.5直方图均衡化处理详细设计
f=rgb2gray(A);先用Matlab自带函数把真彩图像转化成一幅灰度图像,索引图像的颜色映射表转化成灰度颜色映射表
c=histeq(b);%调用Matlab自带的histeq()函数使图像完成直方图均衡化
四、调试过程中出现的问题及相应解决办法
1.课设最初没有用过Matlab编程难度很大,做出来的程序是散的.m文件并且没有可视化的界面操作。
通过参考老师的点拨和同学们的指引完成可视化。
2.程序只能对在代码中填路径,没有实现处理选择的图片。
通过问同学看书上网查资料用setappdata()igetappdata()完成了Callback之间的数值传递
3.程序对一些bmp格式的图片还不能完成设计的操作,原因在于rgb2gray()函数处理黑白图片报错,由于时间有限水平有限还不能解决。
4.由于平时编程少,课程设计过程中遇到许多的问题,有同学的帮助才得以解决
五、程序运行截图及其说明
1.开始运行程序
图5-1运行程序的界面
2.打开预处理图像
图5-2打开预处理图像的界面
3.对比线性展宽
4.灰级窗
5.直方图均衡化
文牛抿度題显示原圉
6显示作者信息,
图5-5显示作者信息
六、简单操作手册
第一步:
打开程序
第二步:
在开始界面中选择文件点击,并打开相对应的文件夹,选择要处理的图片,单击打开第三步:
打开图片后右侧的按钮可选,选择所要执行图像处理的方法单击即可
设计总结
刚开始拿到自己的题目时,大家脸上都露出了茫然的表情,感觉无从下手,但在老师耐心的启发和开导下,终于摸着了头绪,在一番深思熟虑和查阅资料之后终于形成了自己的思路。
但这只是刚刚开始,经过上机实现才发现自己的想法漏洞百出,尽管如此,同学们并没有放弃,在老师的指导和大家坚持不懈的调试下,终于将一个个问题拿下,程序运行成功的那一刻,每个同学都无比激动。
不过这次的综合训练让我受益匪浅,正真的锻炼了我的动手能力。
并且使我对书本上的知识有了更深入的了解。
以前在上图像处理课时,只知道图像锐化就是用数学公式来计算的。
通过这次的训练才明白那些微分算子后面原来隐藏着好多知识,运用它们锐化后的图像发生了很大的变化。
在作业过程中,也遇到了很多问题,体会最深的是,由于学校机房的matlab环境有问题,并且在学校机房里查更多时候要用到个人的资源。
同学们对我的帮忙很大,我非常感激!
还感受到同学们坐在一起讨论问题时的快乐。
这次的综合训练也使我对数字图像产生了浓厚的兴趣。
终于对我们在日常生活中用的一些拍照设备的原理有了一点了解。
总之,这次的训练很有意义
参考资料
[1]朱虹.计算机图象处理基础[M].科学出版社,2005
[2]RC.Gonzalez,RE.Woods著,阮秋琦,阮宇智等译.计算机图象处理(第2版).北京:
电子工业出版社,2003
[3]K.R.Castleman.计算机图象处理.北京:
电子工业出版社,2002
[4]章毓晋.图像处理与分析-图像工程(上册),清华大学,2001
⑸陈垚光毛涛涛精通MATLABGUI设计,电子工业出版社,2008
致谢
首先感谢我的指导老师徐志刚老师,他在我的课程设计过程中提出了指导性的方案和架构,并指引我阅读相关的资料和书籍,使我在不熟悉的领域中仍能迅速掌握新的技术。
感谢我的计算机图像处理刘树群老师和我的C++面向对象老师梁磊老师在
以往的基础课学习中为我打下良好的基础,这是我这次综合训练能够顺利完成的前提。
还有我的同学,亲爱的同学们在课设过程中给予了我巨大的帮助,没有他们,也许就无法完成此次程序设计,在此一并表示感谢,特别鸣谢:
唐凡,陈启祥,陈毅。
附录
functionvarargout=untitled(varargin)gui_Singleton=1;
gui_State=struct('gui_Name',
'gui_Singleton',
mfilename,...gui_Singleton,...
'gui_OpeningFcn',@untitled_OpeningFcn,...
'gui_OutputFcn',
'gui_LayoutFcn',
@untitled_OutputFcn,...
[],...
'gui_Callback',[]);
ifnargin&&ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});endifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
});
end
functionuntitled_OpeningFcn(hObject,eventdata,handles,varargin)set(handles.m_image,'Enable','off');
set(handles.m_run,'Enable','off');set(handles.yuantu,'Enable','off');set(handles.duibidu,'Enable','off');set(handles.huijichuang,'Enable','off');set(handles.zhifangtu,'Enable','off');handles.output=hObject;guidata(hObject,handles);
functionvarargout=untitled_OutputFcn(hObject,eventdata,handles)varargout{1}=handles.output;
functionm_file_Callback(hObject,eventdata,handles)
functionm_file_open_Callback(hObject,eventdata,handles)[filename,pathname]=uigetfile(...
{'*.bmp;*.jpg;*.png;*.jpeg','ImageFiles(*.bmp,*.jpg,*.png,*.jpeg)';...
'*.*','AllFiles(*.*)'},...
'Pickanimage');
axes(handles.a1);%用axes命令设定当前操作的坐标轴是axes_srcfpath=[pathnamefilename];%将文件名和目录名组合成一个完整的路径img_a1=imread(fpath);
imshow(img_a1);%用imread读入图片,并用imshow在axes_src上显示setappdata(handles.figure_he,'img_a1',img_a1);
title('原图');
set(handles.m_image,'Enable','on')set(handles.m_run,'Enable','on')set(handles.yuantu,'Enable','on');set(handles.duibidu,'Enable','on');set(handles.huijichuang,'Enable','on');set(handles.zhifangtu,'Enable','on')functionm_file_save_Callback(hObject,eventdata,handles)functionm_file_close_Callback(hObject,eventdata,handles)close(handles.figure_he);
functionm_run_Callback(hObject,eventdata,handles)functionm_run_1_Callback(hObject,eventdata,handles)img_a1=getappdata(handles.figure_he,'img_a1');A=img_a1;
axes(handles.a1);
flag=isgray(A);
ifflag==0%此为灰度图像图
f=rgb2gray(A);
end
[m,n]=size(f);
fa=40;
fb=120;
ga=20;
gb=160;a=ga/fa;
b=(gb-ga)/(fb-fa);c=(255-gb)/(255-fb);
fori=1:
m
forj=1:
n
iff(i,j)g(i,j)=a*f(i,j);
elseiff(i,j)>=fa&f(i,j)<=fb
g(i,j)=b*(f(i,j)-fa)+ga;
else
g(i,j)=c*(f(i,j)-fb)+gb;
end
end
end
axes(handles.a1);
imshow(g);
title('线性展宽后的图像')
functionm_run_3_Callback(hObject,eventdata,handles)img_a1=getappdata(handles.figure_he,'img_a1');A=img_a1;
axes(handles.a1);
b=rgb2gray(A);%转化为灰度图像
c=histeq(b);%直方图均衡化
axes(handles.a1);
imshow(c);
title('直方图均衡化处理后图像')
functionedit1_Callback(hObject,eventdata,handles)
functionedit1_CreateFcn(hObject,eventdata,handles)
ifispc&&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');
end
functionm_image_Callback(hObject,eventdata,handles)
functionm_run_2_Callback(hObject,eventdata,handles)h=hjc;
img_a1=getappdata(handles.figure_he,'img_a1');
A=img_a1;axes(handles.a1)f=rgb2gray(A);%转化为灰度图像
[m,n]=size(f);
fa=40;
fb=120;
ga=0;
gb=160;
a=0;
b=(gb-ga)/(fb-fa);
c=255;
fori=1:
m
forj=1:
niff(i,j)elseiff(i,j)>=fa&f(i,j)<=fbg(i,j)=b*(f(i,j)-fa);
else
g(i,j)=0;
end
end
end
axes(handles.a1);
imshow(g);
title('灰级窗处理后的图像')
functionyuantu_Callback(hObject,eventdata,handles)img_a1=getappdata(handles.figure_he,'img_a1');
A=img_a1;axes(handles.a1);
axes(handles.a1);
imshow(A);
title('显示原图')
functionduibidu_Callback(hObject,eventdata,handles)img_a1=getappdata(handles.figure_he,'img_a1');
A=img_a1;
axes(handles.a1);
flag=isgray(A);
ifflag==0%此为灰度图像图f=rgb2gray(A);
end
[m,n]=size(f);
fa=40;
fb=120;
ga=20;
gb=160;a=ga/fa;
b=(gb-ga)/(fb-fa);c=(255-gb)/(255-fb);
fori=1:
m
forj=1:
n
iff(i,j)elseiff(i,j)>=fa&f(i,j)<=fb
g(i,j)=b*(f(i,j)-fa)+ga;
else
g(i,j)=c*(f(i,j)-fb)+gb;
end
end
end
axes(handles.a1);imshow(g);
title('线性展宽后的图像')
functionhuijichuang_Callback(hObject,eventdata,handles)img_a1=getappdata(handles.figure_he,'img_a1');
A=img_a1;
axes(handles.a1)
f=rgb2gray(A);%转化为灰度图像
[m,n]=size(f);
fa=40;
fb=120;
ga=0;
gb=160;
a=0;
b=(gb-ga)/(fb-fa);
c=255;
fori=1:
m
forj=1:
n
iff(i,j)g(i,j)=0;
elseiff(i,j)>=fa&f(i,j)<=fb
g(i,j)=b*(f(i,j)-fa);
else
g(i,j)=0;
end
end
end
axes(handles.a1);
imshow(g);
title('灰级窗处理后的图像')
functionzhifangtu_Callback(hObject,eventdata,handles)img_a1=getappdata(handles.figure_he,'img_a1');A=img_a1;
axes(handles.a1);
b=rgb2gray(A);%转化为灰度图像
c=histeq(b);%直方图均衡化
axes(handles.a1);
imshow(c);
title('直方图均衡化处理后图像')
functionUntitled_1_Callback(hObject,eventdata,handles)img_a1=getappdata(handles.figure_he,'img_a1');
A=img_a1;
axes(handles.a1);
axes(handles.a1);
imshow(A);
title('显示原图')
functionUntitled_2_Callback(hObject,eventdata,handles)f