《数字图像处理》
实验报告
姓名: *****
学号:********
专业:电子信息科学与技术
指导老师:********
实验一 :熟悉MATLAB的图象处理工具箱
1、实验目的
1熟悉MATLAB的操作和基本功能;
2理解和掌握图像的平移、垂直镜像变换、水平镜像变换和旋转的原理和应用。
2、实验原理
2.1图像的几何变换
图像的几何变换是指用数学建模的方法来描述图像的大小、形状、位置等变化的方法。图像的几何变换可以看成是像素在图像内的移动过程,该移动过程可以改变图
像中物体对象(像素)之间的空间关系。完整的几何运算需要由两个算法来实现:
空间变换算法和灰度插值算法。空间变换主要用来保持图像中曲线的连续性和物体
的连通性,一般都采用数学函数形式来描述输入、输出图像相应像素间的空间关系。
空间变换一般定义为
g(x, y) = f (x′, y′) = f [a(x, y),b(x, y)]
其中, f 表示输入图像, g 表示输出图像,坐标 (x′, y′)指的是空间变换后的坐
标,要注意这时的坐标已经不是原来的坐标 (x, y)了, a(x, y)和 b(x, y)分别是图像
的x 和y 坐标的空间变换函数。
灰度级插值主要是对空间变换后的像素赋予灰度值,使之恢复原位置处的灰度
值,在几何运算中,灰度级插值是必不可少的组成部分。因为图像一般用整数位置
处的像素来定义。而在几何变换中, g(x, y)的灰度值一般由处在非整数坐标上的
f (x, y)的值来确定,即 g中的一个像素一般对应于 f 中的几个像素之间的位置,反
过来看也是一样,即f 中的一个像素往往被映射到g 中的几个像素之间的位置。
图像平移就是将图像中所有的点都按照指定的平移量水平、垂直移动。设(x0,y0)为原图像上的一点,图像水平平移量为tx,垂直平移量为ty,则平移后点(x0,y0)坐标将变为(x1,y1)。
显然(x0,y0)和(x1,y1)的关系如下:
用矩阵表示如下:
对该矩阵求逆,可以得到逆变换:
即
这样,平移后的图像上的每一点都可以在原图像中找到对应的点。例如,对于新图中的(0,0)像素,代入上面的方程组,可以求出对应原图中的像素(-tx,-ty)。如果tx或ty大于0,则(- tx,- ty)不在原图中。对于不在原图中的点,可以直接将它的像素值统一设置为0或则255(对于灰度图就是黑色或白色)。同样,若有点不在原图中,也就说明原图中有点被移出显示区域。如果不想丢失被移出的部分图像,可以将新生成的图像宽度扩大|tx |,高度扩大| ty |。
3、实验内容与结果分析
3.1图像错切
由错切原理可知,源图与目标图之间的映射关系属均匀映射,因此,对水平错切,只需对图像每一行的初始一列的像素作切移和插值处理,上图是水平方向错切后的结果,图形在水平方向上发生了扭变,变成了斜边,而垂直方向的边,并没有改变。
3.2图像旋转
上图是以图像的中心为圆心旋转,将图像上的所有像素都旋转一个相同的角度。图像的旋转变换是图像的位置变换,由于要显示所有图像,所以在图像旋转变换中扩大了图像范围,导致了旋转后图像变大了。
3.3图像镜像变换
图像的水平镜像操作是将图像左半部分和右半部分以图像垂直中轴线为中心进行镜像对换;图像的垂直镜像操作是将图像上半部分和下半部分以图像水平中轴线为中心进行镜像对换;图像的对角镜像操作是将图像以图像水平中轴线和垂直中轴线的交点为中心进行镜像对换。上图是通过镜像变换后的结果,从图片对比可以知道,图像的镜像变换并不改变图像的形状。
3.4图像平移
平移变换是将一幅图像上的所有点都按照给定的偏移量在水平方向沿X轴,在垂直方向沿Y轴移动。实验中,每个像素值以及其对应的坐标x和y都被平移了50,表现在整个图像上,即向右下角平移sqrt(50*50+50*50),对于不在原图像中的像素值设为0,显示结果如上图所示。
实验二:数字图像增强处理的编程实现
1、实验目的
1. 了解灰度变换增强和空域滤波增强的Matlab实现方法
2. 掌握直方图灰度变换方法
3. 掌握噪声模拟和图像滤波函数的使用方法
4..掌握平滑处理的算法和用途,学习使用均值滤波、中值滤波和拉普拉斯锐化进行图像增强处理的程序设计方法;
5.利用MATLAB程序进行图像增强。
2、实验原理
2.1二值图象原理
二值图像是一种简单的图像格式,它只有两个灰度级,即"0"表示黑色的像素点,"255"表示白色的像素点,至于如何从一幅普通的图像获得二值图像,二值图像处理在图像处理领域占据很重要的位置,在具体的图像处理应用系统中,往往需要对于获得的二值图像再进一步进行处理,以有利于后期的识别工作。二值图像处理运算是从数学形态学下的集合论方法发展起来的,尽管它的基本运算很简单,但是却可以产生复杂的效果。常用的二值图像处理操作有许多方法,如腐蚀、膨胀、细化、开运算和闭运算等等。
2.2加噪声干扰图像
图像噪声是图像在摄取或传输时所受的随机信号干扰,是图像中各种妨碍人们对其信息接受的因素。噪声在理论上可以定义为“不可预测,只能用概率统计方法来认识的随机误差。因此将图像噪声看成是多维随机过程是合适的,因而描述噪声的方法完全可以借用随机过程的描述,即用其概率分布函数和概率密度分布函数。
2.3真色彩增强与减弱
真彩色增强所处理的对象不是一幅灰度图像,而是一幅自然色彩图像或是同一景物的多光谱图像,它是从彩色到彩色的一种转换。通过映射函数变换成新的三基色分量,彩色合成使得增强图像中各目标呈现出于原图像中不同的彩色,这种技术称为真彩色增强。真彩色增强的目的有两个:一个是变换图像的色彩,引起人们的特别关注;另一个是由于人眼对不同颜色的灵敏度不同,使景物呈现出与人眼色觉相匹配的颜色,以提高人眼对目标的分辨力。
2.4伪彩色处理的原理
伪彩色处理是指将黑白图像转化为彩色图像,或者是将单色图像变换成给定彩色分布图像。由于人眼对彩色的分辨能力远远高于对灰度的分辨能力,所以将灰度图像转化成彩色表示,就可以提高对图像细节的辨别力。因此,伪色彩处理的主要目的是为了提高人眼对图像细节的分辨能力,以达到图像增强的目的。 伪彩色处理的基本原理是将黑白图像或者单色图像的各个灰度级匹配到彩色空间中的一点,从而使单色图像映射成彩色图像。对黑白图像中不同的灰度赋予不同的彩色。
设f(x,y)为一幅黑白图像,R(x,y),G(x,y),B(x,y)为f 值得注意的是,伪彩色虽然能将黑白灰度转化为彩色,但这种彩色并不是真正表现图像的原始颜色,而仅仅是一种便于识别的伪彩色。
2.5中值滤波
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为2*2,3*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。
2.6运动模糊图象的复原方法及原理
为了抑制退化而利用有关退化性质知识的预处理方法为图象复原。多数图象复原方法是基于整幅图象上的全局性卷积法。图象的退化可能有多种原因:光学透镜的残次、光电传感器的非线性、胶片材料的颗粒度、物体与摄像机间的相对运动、不当的焦距、遥感或天文中大气的扰动、照片的扫描等等。图象复原的目标是从退化图象中重构出原始图象。
运动模糊图象的恢复是图象复原的主要分支之一,它的恢复算法有很多种。有些算法虽然有很好的恢复效果,但算法复杂,恢复时间比较长(如最大熵法)。有些算法虽然计算速度较快,但恢复效果不尽人意(如空间域逆向恢复)。
下面介绍逆滤波、维纳滤波和有约束最小二乘滤波三种恢复方法的原理。
2.7均值滤波
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围8个象素,构成一个滤波模板,即去掉目标象素本身)。再用模板中的全体像素的平均值来代替原来像素值。均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度个g(x,y),即个g(x,y)=1/m ∑f(x,y) m为该模板中包含当前像素在内的像素总个数。
2.8直方图均衡化
利用直方图统计的结果,通过使图像的直方图均衡的方法称为直方图均衡化,可以达到增强图像的显示效果的作用。由于通过直方图统计,可以观察出,图像中各种亮度所占的比例大都分布不均匀,设法增加在直方图统计中所占比例高的像素和其他占的比例少的像素之间的亮度差,可以提高图像的显示效果。简单来说,直方图增强的方法就是压缩直方图中比例少的像素所占用的灰度范围,多出来的灰度空间按照统计比例分配给直方图中比例高的像素使用。这种方法主要是针对人眼对灰度差别越大的图像更容易分辨的特点而做的增强。
2.9图象锐化的原理
数字图像的锐化可分为线性锐化滤波和非线性锐化滤波。如果输出像素是输入像素领域像素的线性组合则称为线性滤波,否则称为非线性滤波。
1)线性锐化滤波器
线性高通滤波器是最常用的线性锐化滤波器。这种滤波器必须满足滤波器的中心系数为正数,其他系数为负数。线性高通滤波器3×3模板的典型系数
2)非线性锐化滤波器
非线性锐化滤波就是使用微分对图像进行处理,以此来锐化由于邻域平均导致的模糊图像。图像处理中最常用的微分是利用图y像沿某个方向上的灰度变化率,即原图像函数的梯度。梯度定义如下:
△xf=f(x,y)-f(x+1,y) △xf=f(x,y)-f(x,y+1) 梯度模的表达式如下: ∣▽f∣=∣▽xf∣+∣▽yf∣
在数字图像处理中,数据是离散的,幅值是有限的,其发生的最短距离是在两相邻像素之间。因此在数字图像处理中通常采用一阶差分来定义微分算子。
其差分形式为: △xf=f(x+1,y)-f(x,y) △yf=f(x,y+1)-f(x,y)
比较有名的微分滤波器算子包括Sobel 梯度算子、Prewitt 梯度算子和log算子,等等。
3、实验内容与结果分析
3.1二值图像
上图是原图像经过二值化后的结果,二值图像是一种简单的图像格式,它只有两个灰度级,即"0"表示黑色的像素点,"255"表示白色的像素点。二值化后图像有黑白两种图像信息,二值化后的图像可增加辨识度。二值图像处理操作有许多方法,如腐蚀、膨胀、细化、开运算和闭运算等等。
3.2加噪声干扰图像
上图是添加高斯噪声干扰和添加了椒盐噪声干扰的图像,添加噪声干扰是为了模仿图像在拍摄过程中产生的各种噪声干扰,再通过滤波去除图像噪声。或是在噪声不够明显的情况下先进行补噪,再去噪。
3.3真色彩增强与减弱
通过映射函数变换成新的三基色分量,彩色合成使得增强图像中各目标呈现出于原图像中不同的彩色,通过对真色彩的调整,使景物呈现出与人眼色觉相匹配的颜色,提高人眼对目标的分辨力。
3.4灰度分层法伪色彩图像
从图片对比可以看到,黑白图像中的灰度被赋予不同的彩色,提高人眼对图像细节的分辨能力,达到了图像增强的目的。伪彩色虽然能将黑白灰度转化为彩色,但这种彩色并不是真正表现图像的原始颜色,而仅仅是一种便于识别的伪彩色。
3.5中值滤波
由图可见,对有椒盐噪声和高斯噪声的图像,进行中值滤波,对于消除孤立点和线段的干扰中值滤波十分有效,对于高斯噪声则效果不佳。中值滤波的优点在于去除噪声的同时,还能保护图像的边缘信息。
3.6运动模糊
从恢复的图像来看,效果还是可以的,因为这里采用了真实PSF 函数来恢复,但是实际生活当中大多数情况下PSF 是不知道的,所以要按照具体情况具体分析然后再恢复图像。
综合以上两种方法,通过对多幅图像的处理并比较可以看出维纳滤波处理效果较好,而最小二乘方法处理效果相对较差。
3.7均值滤波
3*3模板均值滤波 5*5模板均值滤波 7*7模板均值滤波
比较处理后图像结果可知,邻域平均法的平滑效果与所采用邻域半径大小有关。模板半径越大,则图像模糊程度越大。此时,消除噪声的效果将增强,但同时得到的图像变得模糊,图像细节锐化程度减弱。
3.8直方图均衡化
由图可知均衡化处理后的图象近似均匀分布。均衡化图象的动态范围扩大了,但扩大了量化间隔,而量化级别反而减少了,因此,原来灰度不同的象素经处理后变相同了,形成了一片的相同灰度的区域,各区域之间有明显的边界,从而出现了伪轮廓。
3.9图象非线性锐化
非线性锐化滤波就是使用微分对图像进行处理,以此来锐化由于邻域平均导致的模糊图像。从锐化结果可以看出prewitt算子的锐化结果是最好的,其次是sobel算子,而log算子锐化结果是最差的,边缘轮廓明显没有增强。
实验三:数字图像分割处理的编程实现
1、实验目的
理解和掌握图像分割的基本理论和算法,练习使用形态学、区域、边界和直方图阀值的方法结合图像增强复原的相关知识点对图像进行分割处理。
2、实验原理
2.1直方图双峰法阈值分割
灰度直方图就是灰度级的像素数ni与灰度i的二维关系,它反映了一幅图像上灰度分布的统计特性,在MATLAB中使用函数“imhist.m”来实现。
双峰法就是其中的一种简单的阈值分割方法,即如果直方图呈现明显的双峰状,则选取双峰之间的谷底所对应的灰度级作为阈值分割,该方法不适用于直方图中双峰差别很大或者双峰中间谷底比较宽广而平坦的图像,以及单峰直方图的情况。
2.2边缘检测
图像边缘是图像最基本的特征,边缘在图像分析中起着重要的 用。所谓边缘(edge)是指图像局部特征的不连续性。灰度或结构 信息的突变称为边缘,例如:灰度级的突变、颜色的突变、纹理结 的突变。边缘是一个区域的结束,也是另一个区域的开始,利用该 征可以分割图像。图像的边缘有方向的幅度两个属性,沿边缘方向像素变化平缓, 垂直于边缘方向像素变化剧烈。边缘上的这种变化可以用微分算子检 测出来,通常用一阶导数或二阶导数来检测边缘,不同的是一阶导数 认为最大值对应边缘位置,而二阶导数以过零点对应边缘位置。实际上,对于图像中的任意方向上的边缘都可以进行类似的分析。图像边 缘检测中对任意点的一阶导数可以利用该点梯度的幅度来获得,二阶 导数可以用拉普拉斯算子得到。
3、实验内容与结果分析
3.1 直方图双峰法阈值分割
双峰法就是其中的一种简单的阈值分割方法,即如果直方图呈现明显的双峰状,则选取双峰之间的谷底所对应的灰度级作为阈值分割,该方法不适用于直方图中双峰差别很大或者双峰中间谷底比较宽广而平坦的图像。从灰度图像直方图可知,直方图虽呈双峰但没有明显的谷底,因此用该阈值进行分割难将目标从图像中分割出来。这是由于目标与背景的灰度差距不大造成的。
3.2边缘检测
从图中可以看出,在采用一介微分算子进行边缘检测时,除了微分算子对边缘检测结果有影响外,阈值选择也对边缘检测有重要的影响。比较几种算法检测结果可知,roberts算子提取边缘较完整,边缘连续性较好,优于其他算子。其次是sobel算子,而log算子提取的边缘最差。
实验四:数字图像处理的工程编程实现
1、实验目的
(1)了解并掌握膨胀、腐蚀及开运算、闭运算的基本原理;
(2)编写程序使用开运算、闭运算处理图像,进一步理解开运算、闭运算的实质;
(3)编写程序使用开运算、闭运算进行图像去噪处理,根据实验结果分析效果;
2、实验原理
2.1 形态学骨架提取
数学形态学的骨架化方法。是一门建立在数学图论基础上的学科,是几何形态学分析和描述的有力数学工具。它的基本思想是用具有一定形态的结构元素去量度和提取图像中的对应形状以达到对图像分析和识别的目的。用数学形态学处理图像可以简化图像数据,除去不相干的结构,保持它们基本的形状特性,并且有天然的并行实现的结构优点。 但是利用数学形态学理论提取物体骨架,存在一些问题:一是得到的骨架是非连通的;二是容易受边界噪声的影响。把目前形态学的骨架提取方法研究范围从二值图像推广到灰度图像、彩色图像、三维图像,可以提高骨架包含信息量,从而提高后期识别统计概率。另外提高提取效率,得到实时处理的效果成为今后的发展方向。
2.2开—闭运算
1.开运算(先腐蚀后膨胀的过程):利用它可以消除小物体,在纤细点处分离物体,平滑较大物体边界,但同时并不明显改变原来物体的面积
2.闭运算(先膨胀后腐蚀的过程):利用它可以填充物体内细小空洞,连接临近物体、平滑其边界,但同时并不明显改变原来物体的面积
从图中可以看出,开闭运算都降低了噪声,但是开运算处理中,处理后的图形与效果比较
好,而且尺寸与原来一样,但是背景中的噪声没有处理完全。
闭运算中,图像明显的断开,与原图相差大,但是背景中的噪声已经几乎没有了,先对于开运算背景处理效果要好。 综上可以看出,噪声处理用开闭运算都可以,如果要使背景中的噪声减小,可以选择先进行闭运算,如果要使图像本身保持良好,则可选择先进行开运算。
2.3腐蚀和膨胀原理
二值图像基本的形态学运算是腐蚀和膨胀,简单的腐蚀是消除物体的所有边界点的一种过程,其结果是使剩下的物体沿其周边比原物体小一个像素的面积。如果物体是圆的,它的直径在每次腐蚀后将减少两个像素,如果物体在某一点处任意方向上连通的像素小于三个,那么该物体经过一次腐蚀后将在该点处分裂为二个物体。简单的膨胀运算是将与某物体接触的所有背景点合并到该物体中的过程。过程的结果是使物体的面积增大了相应数量的点,如果物体是圆的,它的直径在每次膨胀后将增大两个像素。如果两个物体在某一点的任意方向相隔少于三个像素,它们将在该点连通起来。
腐蚀可以消除图像中小的噪声区域,膨胀可以填补物体中的空洞。对一个图像先进行腐蚀运算然后再膨胀的操作过程称为开运算,它可以消除细小的物体、在纤细点处分离物体、平滑较大物体的边界时不明显的改变其面积。如果对一个图像先膨胀然后再收缩,我们称之为闭运算,它具有填充物体内细小的空洞、连接邻近物体、在不明显改变物体面积的情况下平滑其边界的作用。通常情况下,当有噪声的图像用阈值二值化后,所得到的边界是很不平滑的,物体区域具有一些错判的孔洞,背景区域散布着一些小的噪声物体,连续的开和闭运算可以显著的改善这种情况,这时候需要在连接几次腐蚀迭代之后,再加上相同次数的膨胀,才可以产生所期望的效果。
2.4傅里叶变换
图像频谱是表征图像灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。二维傅里叶变换一般用在数字图像处理中,一般是二维的灰度图像f(x,y)变换到频域F(u,v)
在频谱图中,中心部分(uv坐标系中点(0,0)附近)表示原图像中的低频部分,是图像中灰度变化不太快的成分,反映了图像的主体框架;而频谱的四周,也即是高频区域是图像中灰度变化较快的成分,一般反映着图像中的椒盐噪声(突发性的白点或黑点)或者是图像内部变化剧烈的边缘成分。
如果原始图像具有十分明显的规律,例如将一个简单图样有规律的平移并填满整个图形,那么其频谱一般表现为坐标原点周围的一圈亮点。
3、实验内容与结果分析
3.1 形态学骨架提取
从实验结果现象,可以看出所得到的骨架是非连通的,采用数学形态学处理图像可以简化图像数据,除去不相干的结构,保持它们基本的形状特性,但从结果来看对于该图像采用形态学骨架提取效果并不理想。
3.2开—闭运算
图1为用三阶单位矩阵的结构元素进行开运算结果;图2为用三阶单位矩阵的结构元素进行闭运算结果;图3为用原点到顶点距离均为2的平坦菱形结构进行开运算结果;图4为用原点到顶点距离均为2的平坦菱形结构进行闭运算结果。开运算显示对图形进行腐蚀消除了点噪声,平滑边界,再进行膨胀使图像恢复原来尺寸,闭运算则是先膨胀时原来的噪声加大,连接临近物体,再腐蚀以恢复原来尺寸,因此出现了以上图像中两种不同的处理效果。
3.3灰度腐蚀与膨胀
从图中对比可知,灰度图像的腐蚀,如果结构元素的值都为正,则输出图像会比输入图像暗;如果输入图像中亮细节的尺寸比结构元素小,则其影响会被减弱,减弱的程度取决于这些亮度细节周围的灰度值和结构元素的形状和幅值。灰度图像的膨胀运算,如果结构元素的值都为正,则输出图像比输入图像亮,图像的暗细节在膨胀中被消减或被消除。
3.4图像傅里叶变换
通过观察傅立叶变换后的频谱图,可以看出图像的能量分布,因为各点与邻域差异都不大,梯度相对较小,所以频谱图中暗的点数较多,图像是比较柔和的。对频谱移频到原点以后,可以看出图像的频率分布是以原点为圆心,对称分布的。变换之后的图像在原点平移之前四角是低频,最亮,平移之后中间部分是低频,最亮,亮度大说明低频的能量大。
4、验心得体会
为了完成本次实验,查阅了一些数字图像处理的书籍,也花了较多时间和精力为实验做准备。实验过程也犯了一些低级错误,比如在对灰度图像处理的时候,没有将真色彩图像进行转换,导致编译老是错误。通过本次的图像处理实验,一方面对matlab的使用更加的了解,对matlab程序的编写有了更深的了解,另一方面通过动手实践和理论基础的结合,对图像处理原理的理解有了进一步的提高。但同时也发现自身的不足,理论知识比较欠缺,为了方便理解只能选择比较简单的算法对图像进行处理。希望以后能在图像处理方面能够有进一步的提高。
实验程序
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I = imread('I:\p.bmp');
axes(handles.axes1); %使用第一个axes
imshow(I); %显示图片;
title('原图');
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I = imread('I:\p.bmp');
axes(handles.axes2); %使用第2个axes
i = rgb2gray(I);%把真色彩转换为灰度图像
imshow(i);
title('灰度图像');
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I = imread('I:\p.bmp');
axes(handles.axes2); %使用第2个axes
b = im2bw(I,0.5);
imshow(b);
title('二值图像');
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I = imread('I:\p.bmp');
J = imnoise(I,'salt & pepper',0.04);%加均值为0,方差为0.04的椒盐噪声
axes(handles.axes2);
imshow(J);
title('椒盐噪声干扰图像');
J1=imnoise(I,'gaussian',0.04);%加均值为0,方差为0.04的高斯噪声
axes(handles.axes1); %使用第1个axes
imshow(J1);
title('高斯噪声干扰图像');
% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I1 = imread('I:\p.bmp');
I = rgb2gray(I1);
axes(handles.axes2); %使用第2个axes
J=filter2(fspecial('average',3),I)/255;%fspecial函数用于产生预定义滤波器
imshow(J);
title('3*3模板均值滤波');
axes(handles.axes3); %使用第3个axes
J2=filter2(fspecial('average',5),I)/255;
imshow(J2);
title('5*5模板均值滤波');
axes(handles.axes4); %使用第4个axes
J3=filter2(fspecial('average',7),I)/255;
imshow(J3);
title('7*7模板均值滤波');
% --- Executes on button press in pushbutton6.
function pushbutton6_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I = imread('I:\p.bmp');
m = imadjust(I,[,],[0.5;1]) ;
n = imadjust(I,[,],[0;0.5]) ;%图像变暗
g=255-I;%负片效果
axes(handles.axes1);imshow(I);title('原图像')
axes(handles.axes2);imshow(m);title('图像变亮')
axes(handles.axes3);imshow(n);title('图像变暗')
axes(handles.axes4);imshow(g);title('负片效果')
% --- Executes on button press in pushbutton7.
function pushbutton7_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton7 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I1 = imread('I:\p.bmp');
I = rgb2gray(I1);
X=grayslice(I,16);%原灰度图像度分16层,转换为伪色彩图
axes(handles.axes1);
imshow(X,hot(16));
title('伪色彩图像')
% --- Executes on button press in pushbutton8.
function pushbutton8_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I1 = imread('I:\p.bmp');
I = rgb2gray(I1);
J=imnoise(I,'gaussian',0.02);
K1 = medfilt2(J,[3 3]);%对矩阵i进行二维中值滤波,领域为3*3
axes(handles.axes2);
imshow(K1);
title('加噪 3*3二维中值滤波');
axes(handles.axes3);
T=medfilt2(J,[5,5]);
imshow(T);
title('加噪 5*5二维中值滤波');
axes(handles.axes4);
F=medfilt2(J,[7,7]);
imshow(F);
title('加噪 7*7二维中值滤波');
% --- Executes on button press in pushbutton9.
function pushbutton9_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton9 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I1 = imread('I:\p.bmp');
I = rgb2gray(I1);
I=double(I);
axes(handles.axes1);
imshow(uint8(I));
I_rot30=imrotate(I,30 ,'nearest');
axes(handles.axes2);
imshow(uint8(I_rot30));
title('旋转30度');
I_rot45=imrotate(I,45 ,'nearest');
axes(handles.axes3);
imshow(uint8(I_rot45));
title('旋转45度');
I_rot60=imrotate(I,60 ,'nearest');
axes(handles.axes4);
imshow(uint8(I_rot60));
title('旋转60度');
% --- Executes on button press in pushbutton10.
function pushbutton10_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton10 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%图像错切
I = imread('I:\p.bmp');
I=double(I);
H=size(I);
B=zeros(H(1)+round(H(2)*tan(pi/6)),H(2),H(3));
for a=1:H(1)
for b=1:H(2)
B(a+round(b*tan(pi/6)),b,1:H(3))=I(a,b,1:H(3));
end
end
axes(handles.axes2);
imshow(uint8(B));
% --- Executes on button press in pushbutton11.
function pushbutton11_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton11 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I = imread('I:\p.bmp');
I=double(I);
H=size(I);
I_fliplr(1:H(1),1:H(2),1:H(3))=I(1:H(1),H(2):-1:1,1:H(3));%水平镜像,fliplr函数实现矩阵的左右翻转
axes(handles.axes2);
imshow(uint8(I_fliplr));
title('水平镜像');
I_flipud(1:H(1),1:H(2),1:H(3))=I(H(1):-1:1,1:H(2),1:H(3));%垂直镜像,flipud函数可以实现矩阵的上下翻转
axes(handles.axes3);
imshow(uint8(I_flipud));
title('垂直镜像');
I_fliplr_flipud(1:H(1),1:H(2),1:H(3))=I(H(1):-1:1,H(2):-1:1,1:H(3));%实现对角翻转
axes(handles.axes4);
imshow(uint8(I_fliplr_flipud));
title('对角镜像')
% --- Executes on button press in pushbutton12.
function pushbutton12_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton12 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I = imread('I:\p.bmp');
I=double(I);
axes(handles.axes2);
I_moveresult=zeros(size(I));
H=size(I);
Move_x=50;
Move_y=50;
I_moveresult(Move_x+1:H(1),Move_y+1:H(2),1:H(3))=I(1:H(1)-Move_x,1:H(2)-Move_y,1:H(3));
imshow(uint8(I_moveresult));
% --- Executes on button press in pushbutton13.
function pushbutton13_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton13 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I = imread('I:\p.bmp');
LEN=30;
THETA=75; %设置运动角度为75度
PSF=fspecial('motion',LEN,THETA);
MF=imfilter(I,PSF,'circular','conv');
axes(handles.axes2);
imshow(MF);
title('运动模糊');
axes(handles.axes1); %使用第一个axes
imshow(I); %显示图片;
title('原图');
%恢复图像
wnr2 = deconvwnr(MF, PSF);
axes(handles.axes3);
imshow(wnr2);
title('维纳滤波复原')
NP=0.002*prod(size(I));
[reg1 LAGRA]=deconvreg(MF,PSF,NP/3.0);
axes(handles.axes4);
imshow(reg1);
title('最小二乘滤波复原');
% --- Executes on button press in pushbutton14.
function pushbutton14_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton14 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%空域高通滤波
I1 = imread('I:\p.bmp');
I = rgb2gray(I1); %灰度图像
J=im2double(I);%转换图像矩阵为双精度型
axes(handles.axes1);
imshow(J,[ ]);
title('原灰度图像')
h1=[0 -1 0,-1 -5 -1,0 -1 0];
h2=[-1 -1 -1,-1 -9 -1,-1 -1 -1];
h3=[1 -2 1,-2 5 -2,1 -2 1];
A=conv2(J,h1,'same');%进行二维卷积操作
axes(handles.axes2);
imshow(A,[ ]);
title('h1算子')
B=conv2(J,h2,'same');%进行二维卷积操作
axes(handles.axes3);
imshow(B,[ ]);
title('h2算子')
C=conv2(J,h3,'same');%进行二维卷积操作
axes(handles.axes4);
imshow(C,[ ]);
title('h3算子')
% --- Executes on button press in pushbutton15.
function pushbutton15_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton15 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I = imread('I:\p.bmp');
b = im2bw(I,0.5);
axes(handles.axes1); %使用第1个axes
imshow(b);
title('二值图像');
F=bwmorph(b,'skel',inf);
axes(handles.axes2);
imshow(F);
title('骨架提取');
% --- Executes on button press in pushbutton16.
function pushbutton16_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton16 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I1 = imread('I:\p.bmp');
I = rgb2gray(I1); %灰度图像
s=ones(3,3);%三阶单位矩阵
bw1=imopen(I,s);%用三阶单位矩阵的结构元素进行开运算
axes(handles.axes1);
imshow(bw1);
title('图1')
bw2=imclose(I,s);%用三阶单位矩阵的结构元素进行闭运算
axes(handles.axes2);
imshow(bw2);
title('图2')
s1=strel('diamond',2);%用原点到顶点距离均为2的平坦菱形结构进行开运算
bw3=imopen(I,s1);
axes(handles.axes3);
imshow(bw3);
title('图3')
bw4=imclose(I,s1);%用原点到顶点距离均为2的平坦菱形结构进行闭运算
axes(handles.axes4);
imshow(bw4);
title('图4')
% --- Executes on button press in pushbutton17.
function pushbutton17_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton17 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I1 = imread('I:\p.bmp');
I = rgb2gray(I1);
s=ones(3,3);
bw1=imerode(I,s);
axes(handles.axes1);
imshow(bw1);
title('图a')
bw2=imdilate(I,s);
axes(handles.axes2);
imshow(bw2);
title('图b')
s1=strel('disk',2);%半径为2的平坦圆盘形结构元素进行腐蚀
bw3=imerode(I,s1);
axes(handles.axes3);
imshow(bw3);
title('图c')
bw4=imdilate(I,s1);%用半径为2的平坦圆盘形结构元素进行膨胀
axes(handles.axes4);
imshow(bw4);
title('图d')
% --- Executes on button press in pushbutton18.
function pushbutton18_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton18 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%直方图双峰法阈值
I1 = imread('I:\p.bmp');
I = rgb2gray(I1); %灰度图像
axes(handles.axes1);
imshow(I);
figure;
imhist(I);
title('灰度图像直方图')
Inew=im2bw(I,140/255);%图像二值化,根据140/255确定的阈值,划分目标与背景
figure;
imshow(Inew);
title('T=140时阈值分割后的图像')
% --- Executes on button press in pushbutton19.
function pushbutton19_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton19 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I1 = imread('I:\p.bmp');
I = rgb2gray(I1);
BW1=edge(I,'sobel',0.1);
axes(handles.axes1);
imshow(BW1);
title('sobel算子进行边缘检测');
BW2=edge(I,'roberts',0.1);
axes(handles.axes2);
imshow(BW2);
title('roberst算子进行边缘检测');
BW3=edge(I,'log',0.1);
axes(handles.axes3);
imshow(BW3);
title('log算子进行边缘检测');
BW4=edge(I,'canny',0.1);
axes(handles.axes4);
imshow(BW4);
title('canny算子进行边缘检测');
% --- Executes on button press in pushbutton20.
function pushbutton20_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton20 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I1 = imread('I:\p.bmp');
I = rgb2gray(I1); %灰度图像
figure(1);
imshow(I);
title('原图像');
J=histeq(I);
figure(2);
imshow(J);
title('图像进行直方图均衡化');
figure(3);
imhist(I,64);%显示64个灰度级
title('原图像的直方图灰度分布');
figure(4);
imhist(J,64);%显示均衡化后的图像直方图
title('均衡化后的图像直方图');
% --- Executes on button press in pushbutton21.
function pushbutton21_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton21 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I0 = imread('I:\p.bmp');
I = rgb2gray(I0); %灰度图像
axes(handles.axes1);
imshow(I);
title('原图像');
H=fspecial('sobel');%应用Sobel算子锐化图像
I1=filter2(H,I);%Sobel算子滤波锐化
axes(handles.axes2);
imshow(I1);
title('Sobel算子锐化图像');
H=fspecial('prewitt');
I2=filter2(H,I);%prewitt算子滤波锐化
axes(handles.axes3);
imshow(I2);
title('prewitt算子锐化图像');
H=fspecial('log');
I3=filter2(H,I);%log算子滤波锐化
axes(handles.axes4);
imshow(I3);
title('log算子锐化图像');
% --- Executes on button press in pushbutton22.
function pushbutton22_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton22 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I1 = imread('I:\p.bmp');
I = rgb2gray(I1); %灰度图像
axes(handles.axes1);
imshow(I); %显示原图像
title('原灰度图像');
fftI=fft2(I); %二维离散傅立叶变换
sfftI=fftshift(fftI); %直流分量移到频谱中心
RR=real(sfftI); %取傅立叶变换的实部
II=imag(sfftI); %取傅立叶变换的虚部
A=sqrt(RR.^2+II.^2);%计算频谱幅值
A=(A-min(min(A)))/(max(max(A)))*255; %归一化
axes(handles.axes2);
imshow(A); %显示原图像的频谱
title('原图像的频谱');
% --- Executes on button press in pushbutton23.
function pushbutton23_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton23 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
I1 = imread('I:\p.bmp');
I = rgb2gray(I1); %灰度图像
axes(handles.axes1);
imshow(I); %显示原图像
I=double(I);
[M,N]=size(I);
L=256;
for i=1:M
for j=1:N
if I(i,j)<=L/4
R(i,j)=0;
G(i,j)=4*I(i,j);
B(i,j)=L;
elseif I(i,j)<=L/2
R(i,j)=0;
G(i,j)=L;
B(i,j)=-4*I(i,j)+2*L;
elseif I(i,j)<=3*L/4
R(i,j)=4*I(i,j)-2*L;
G(i,j)=L;
B(i,j)=0;
else
R(i,j)=L;
G(i,j)=-4*I(i,j)+4*L;
B(i,j)=0;
end
end
end
for i=1:M
for j=1:N
OUT(i,j,1)=R(i,j);
OUT(i,j,2)=G(i,j);
OUT(i,j,3)=B(i,j);
end
end
OUT=OUT/256;
axes(handles.axes2);
imshow(OUT);
GUI模块