燕山大学图像处理课后作业之超限像素平滑法和k个邻点平均法
- 格式:doc
- 大小:223.50 KB
- 文档页数:4
1. 图像处理的主要方法分几大类?答:图字图像处理方法分为大两类:空间域处理(空域法)和变换域处理(频域法)。
空域法:直接对获取的数字图像进行处理。
频域法:对先对获取的数字图像进行正交变换,得到变换系数阵列,然后再进行处理,最后再逆变换到空间域,得到图像的处理结果2. 图像处理的主要内容是什么?答:图形数字化(图像获取):把连续图像用一组数字表示,便于用计算机分析处理。
图像变换:对图像进行正交变换,以便进行处理。
图像增强:对图像的某些特征进行强调或锐化而不增加图像的相关数据。
图像复原:去除图像中的噪声干扰和模糊,恢复图像的客观面目。
图像编码:在满足一定的图形质量要求下对图像进行编码,可以压缩表示图像的数据。
图像分析:对图像中感兴趣的目标进行检测和测量,从而获得所需的客观信息。
图像识别:找到图像的特征,以便进一步处理。
图像理解:在图像分析的基础上得出对图像内容含义的理解及解释,从而指导和规划行为。
3. 名词解释:灰度、像素、图像分辨率、图像深度、图像数据量。
答:像素:在卫星图像上,由卫星传感器记录下的最小的分立要素(有空间分量和谱分量两种)。
通常,表示图像的二维数组是连续的,将连续参数 x,y ,和 f 取离散值后,图像被分割成很多小的网格,每个网格即为像素 图像分辨率:指对原始图像的采样分辨率,即图像水平或垂直方向单位长度上所包含的采样点数。
单位是“像素点/单位长度”图像深度是指存储每个像素所用的位数,也用于量度图像的色彩分辨率.图像深度确定彩色图像的每个像素可能有的颜色数,或者确定灰度图像的每个像素可能有的灰度级数.它决定了彩色图像中可出现的最多颜色数,或灰度图像中的最大灰度等级(图像深度:位图图像中,各像素点的亮度或色彩信息用二进制数位来表示,这一数据位的位数即为像素深度,也叫图像深度。
图像深度越深,能够表现的颜色数量越多,图像的色彩也越丰富。
)图像数据量:图像数据量是一幅图像的总像素点数目与每个像素点所需字节数的乘积。
图像平滑处理图像平滑处理是一种常用的图像处理技术,它可以减少图像中的噪声和细节,并使图像变得更加柔和和自然。
在图像处理领域,图像平滑处理被广泛应用于图像增强、边缘检测、图像分割等多个方面。
在进行图像平滑处理之前,我们首先需要了解图像的基本概念和表示方式。
图像可以看作是一个由像素组成的矩阵,每个像素代表着图像中的一个点,其具有特定的灰度值或颜色值。
在进行平滑处理时,我们需要考虑如何在保留图像主要特征的同时,降低噪声和细节。
常见的图像平滑处理方法包括均值滤波、中值滤波、高斯滤波等。
下面将详细介绍这些方法的原理和应用。
1. 均值滤波:均值滤波是一种简单的平滑处理方法,它通过计算像素周围邻域的平均值来替代该像素的值。
具体步骤如下:- 定义一个固定大小的滑动窗口,窗口大小通常为奇数,如3x3、5x5等。
- 将滑动窗口中所有像素的值求平均,并将平均值赋给窗口中心的像素。
均值滤波适用于处理噪声较小的图像,但对于噪声较大的图像效果较差。
2. 中值滤波:中值滤波是一种非线性滤波方法,它通过计算像素周围邻域的中值来替代该像素的值。
具体步骤如下:- 定义一个固定大小的滑动窗口,窗口大小通常为奇数,如3x3、5x5等。
- 将滑动窗口中所有像素的值排序,取中间值作为窗口中心像素的值。
中值滤波适用于处理椒盐噪声等噪声类型,能够有效去除噪声,但可能会导致图像细节的丢失。
3. 高斯滤波:高斯滤波是一种基于高斯函数的线性平滑方法,它通过计算像素周围邻域的加权平均值来替代该像素的值。
具体步骤如下:- 定义一个固定大小的滑动窗口,窗口大小通常为奇数,如3x3、5x5等。
- 根据高斯函数计算滑动窗口中每个像素的权重。
- 将滑动窗口中所有像素的值乘以对应的权重,并将结果相加,最后将结果赋给窗口中心的像素。
高斯滤波能够有效平滑图像并保留图像的细节,是一种常用的图像平滑处理方法。
除了上述方法,还有一些其他的图像平滑处理方法,如双边滤波、导向滤波等,它们在不同的应用场景下具有不同的优势和适用性。
K均值算法是一种常用的聚类分析方法,它通过将数据点划分为具有相似特征的多个集群,以便对数据进行更好的理解和分析。
在图像处理领域,K均值算法也被广泛应用,可以用来对图像进行分割、压缩和特征提取等操作,为图像处理提供了一种有效的方法。
一、K均值算法原理K均值算法的原理比较简单,首先需要确定要将数据划分成多少个集群,即确定K值。
然后随机选择K个数据点作为初始的聚类中心,将其他数据点分配到距离最近的聚类中心所在的集群中。
接着计算每个集群的均值,并将该均值作为新的聚类中心,不断迭代直到收敛为止。
最终得到K个聚类中心,将数据点分配到这些聚类中心所在的集群中。
二、K均值算法在图像分割中的应用在图像处理中,图像分割是一项重要的任务,它将图像分成若干个具有相似特征的区域,有利于对图像进行进一步分析和处理。
K均值算法可以应用于图像分割中,通过将图像的像素点作为数据点,利用K均值算法将图像分成若干个区域,每个区域具有相似的颜色和纹理特征。
这样可以实现图像的自动分割,为后续的图像处理任务提供了基础。
三、K均值算法在图像压缩中的应用除了图像分割,K均值算法还可以应用于图像压缩中。
在图像处理中,图像压缩是为了减少图像的存储空间和传输带宽,同时保持图像的信息内容。
K均值算法可以通过对图像进行聚类,将相似的像素点合并为一个聚类中心,从而实现图像的压缩。
这样可以减小图像的体积,提高图像的传输和存储效率。
四、K均值算法在图像特征提取中的应用另外,K均值算法还可以应用于图像特征提取中。
在图像处理中,图像特征提取是一项重要的任务,它可以帮助我们理解图像的内容和结构。
K均值算法可以应用于对图像的颜色、纹理等特征进行聚类分析,从而提取出图像的关键特征,为图像的识别和分类提供了依据。
五、K均值算法的优缺点K均值算法在图像处理中有着广泛的应用,但是也存在一些缺点。
首先,K均值算法对K值的选择比较敏感,不同的K值可能会导致不同的聚类结果。
其次,K均值算法对初始的聚类中心比较敏感,初始聚类中心的选择不同可能会导致不同的聚类结果。
主要学习内容1.数字图像处理( Digital Image Processing )又称为计算机图像处理, 它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程, 以提高图像的实用性, 从而达到人们所要求的预期结果。
例如: 对照片反差进行变换;对被噪声污染的工业电视图像去除噪声;从卫星图片中提取目标物特征参数等等。
与人类对视觉机理着迷的历史相比, 数字图像处理还是一门相对年轻的学科。
但在其短短的历史中, 它却以程度不同的成功被应用于几乎所有与成像有关的领域。
由于其表现方式(用图像显示)所固有的魅力, 它几乎吸引了从科学家到平民百姓太多的注意。
几个新的技术发展趋势将进一步刺激该领域的成长: 包括由低价位微处理器支持的并行处理技术;用于图像数字化的低成本的电荷耦合器件(CCD);用于大容量、低成本存储阵列的新存储技术;以及低成本、高分辨的彩色显示系统。
另一个推动力来自于稳定涌现出的新的应用。
在商业、工业、医学应用中, 数字成像技术的使用持续增长。
尽管军费在削减, 在遥感成像中却更多地使用了数字图像处理技术。
低成本的硬件加上正在兴起的几个非常重要的应用, 我们可以预料到数字图像处理在将来会发挥更重要的作用。
2.图像增强技术图像增强是指按特定的需要突出一幅图像中的某些信息, 同时, 削弱或去除某些不需要的信息的处理方法。
其主要目的是处理后的图像对某些特定的应用比原来的图像更加有效。
图像增强技术主要包含直方图修改处理、图像平滑化处理、图像尖锐化处理和彩色处理技术等。
空间域平滑技术为了抑制噪声改善图像质量所进行的处理称为图像平滑或去噪。
它可以在空间域或频率域中进行。
此处介绍空间域的几种平滑方法。
(1)局部平滑法局部平滑发又称邻域平均法或移动平均法。
它是利用像素邻域内的各像素的灰度平均值代替该像素原来的灰度值, 实现图像的平滑。
邻域平均法是将当前像素邻域内各像素的灰度平均值作为其输出值的去噪方法。
其作用相当于用这样的模板同图像卷积。
理论部分一、概念解释题1.数字图像:用计算机存储和处理的图像,是一种空间坐标和灰度均不连续、以离散数学原理表达的图像2.数字图像处理:对一个物体的数字表示施加一系列的操作,以得到所期望的结果3.扫描:将一个数学虚拟网格覆盖在一幅图像上,图像的平面空间被离散化成一个个的有序的格子,然后按照格子的排列顺序依次读取图像的信息的过程4数字化:一幅图像从其原来的形式转换为数字形式的处理过程4.采样:将空间上连续的图像变换成离散点(即像素)的操作5.量化:采样后图像被分割成空间上离散的像素,但其灰度值没有改变。
量变是将像素灰度值转化成整数灰度级的过程6.采样定理:说明采样频率与信号频谱之间的关系,是连续信号离散化的基本依据7.直方图:是灰度级的描述,描述的是图像中各个灰度级像素的个数8.邻域:中心像素的行列成为该像素的领域9.特征空间:把从图像提取的m个特征量y1,y 2,…,y m,用m维的向量Y=[y1 y2…y m]t表示称为特征向量。
另外,对应于各特征量的m维空间叫做特征空间10.几何纠正:将含有畸变的图像纳入到某种地图投影11.内方位元素:表示摄影中心与相片之间相关位置的参数12.外方位元素:确定摄影光束在摄影瞬间的空间位置和姿态的参数13.GCP点:多项式纠正法地面控制点14.灰度重采样:像元灰度值根据周围阵列像元的灰度确定15.正射校正:16.辐射校正:消除图像数据中依附在辐亮度中的各种失真的过程17.大气校正:消除主要由大气散射、吸收引起的辐射误差的处理过程18.地形校正:19.图像镶嵌:将多个具有重叠部分的图像制作成一个没有重叠的新图像20.辐射增强:通过改变像元的亮度值来改变图像像元的对比度,从而改善图像质量的图像处理方法21.空间域增强:通过改变单个像元及相邻像元的灰度值来增强图像22.频率域增强:将图像经傅立叶变换后的频谱成分进行处理,然后逆傅立叶变换获得所需的图像23.直方图均衡化:对原始图像的像素灰度做某种映射变换,使变换后图像的灰度级均匀分布24.直方图规定化:为了使单波段图像的直方图变成规定形状的直方图而对图像进行转换的增强方法25.中值滤波:将窗口内的所有像素值按大小排序后,取中值作为中心像素的新值26.同态滤波:减少低频增加高频,对照度进行低通滤波,对反射度进行高通滤波,从而减少光照变化并锐化边缘或细节的图像滤波方法27.假彩色增强:对一幅自然彩色图像或同一景物的多光谱图像,通过映射函数变换成新的三基色分量28.HIS模型:色调H是描述纯色的颜色属性,而饱和度S提供了白光冲淡纯色程度的亮度29.植被指数:是基于植被叶绿素在红色波段的强烈吸收以及在近红外波段的强烈反射,通过红和近红外波段的比值或线性组合实现对植被信息状态的表达30.主成份变换:针对多波段图像进行的数学变换方法,常用于数据的压缩或噪声的去除31.缨帽变换:适用于LANDSAT图像的多波段经验性变换方法,变换结果可以较好的突出主体地物特征32.图像融合:采用一定的方法将不同类型的数据“融合”成一幅图像,可以同时达到高的光谱分辨率和空间分辨率33.计算机分类:对遥感图像上的地物进行属性的识别和分类34.模式识别:在图像分割的基础上提取特征,对图像中的内容进行判决分类35.监督分类:即先选择有代表性的验训练区,用已知地面的各种地物光谱特征来训练计算机,取得识别分类判别规则,并以此做标准对未知地区的遥感数据进行自动分类识别36.非监督分类:即按照灰度值向量或波谱样式在特征空间聚集的情况划分点群或类别37.最大似然度:38.Mahalanobis距离:是一种加权的欧式距离,它通过协方差矩阵来考虑变量的相关性39.ISODATA法分类:迭代式自组织数据分析算法40.分类后处理:为了解决光谱类和地物类的关系以及其他一些专业及专业制图的技术问题,分类后还需进行的各种处理41.生产者精度:表示实际的任意一个随机样本与分类图上同一地点的分类结果相一致的条件概率,用于比较各分类方法的好坏42.用户精度:表示从分类结果图中任取一个随机样本,其所具有的类型与地面的实际类型相同的条件概率,表示分类结果中各类别的可信度43.Kappa系数:测定两幅图之间吻合度或精度的指标二、简答题1.简述模拟图像处理和数字图像处理的区别。
K均值算法在图像处理中的应用方法K均值算法是一种常用的聚类算法,它可以将数据集划分成K个不同的类别。
在图像处理领域,K均值算法被广泛应用于图像分割、图像压缩、图像识别等方面。
本文将介绍K均值算法在图像处理中的应用方法,并探讨其优势和局限性。
一、图像分割图像分割是图像处理中的重要任务,它可以将图像分成若干个具有独立特征的区域,为后续的目标检测与识别提供了基础。
K均值算法可以通过对图像像素的聚类,实现图像的分割。
首先,将图像中的像素看作是数据集中的样本点,然后利用K均值算法对这些样本点进行聚类,最终得到图像的分割结果。
通过调整K的取值,可以得到不同数量和形状的分割区域,从而满足不同场景下的需求。
二、图像压缩图像压缩是图像处理中的另一个重要任务,它可以减少图像数据的存储空间和传输带宽。
K均值算法可以通过对图像像素的聚类,实现图像的压缩。
将图像中的像素看作是数据集中的样本点,利用K均值算法将这些样本点进行聚类,然后用聚类中心的灰度值代替原始像素值,从而实现图像的压缩。
通过调整K的取值,可以得到不同质量和大小的压缩图像,从而满足不同应用场景下的需求。
三、图像识别图像识别是图像处理中的一个热门领域,它可以通过对图像中的目标进行识别和分类,实现自动化的图像分析与理解。
K均值算法可以通过对图像像素的聚类,实现图像的特征提取和分类。
首先,将图像中的像素看作是数据集中的样本点,然后利用K均值算法对这些样本点进行聚类,最终得到图像的特征表示。
通过比较待识别图像的特征与已知类别的特征,可以实现对图像中目标的识别和分类。
K均值算法在图像处理中的应用方法优势1. 算法简单易懂:K均值算法是一种简单和直观的聚类算法,易于理解和实现。
2. 计算速度快:K均值算法的时间复杂度较低,适合处理大规模的图像数据。
3. 灵活性高:通过调整K的取值,可以得到不同数量和形状的分割区域、不同质量和大小的压缩图像、不同特征表示和分类效果的图像识别。
数字图像处理知识点总结第一章导论1.图像:对客观对象的一种相似性的生动性的描述或写真.2.图像分类:按可见性(可见图像、不可见图像),按波段数(单波段、多波段、超波段),按空间坐标和亮度的连续性(模拟和数字)。
3.图像处理:对图像进行一系列操作,以到达预期目的的技术。
4.图像处理三个层次:狭义图像处理、图像分析和图像理解。
5.图像处理五个模块:采集、显示、存储、通信、处理和分析。
第二章数字图像处理的基本概念6.模拟图像的表示:f(x,y)=i(x,y)×r(x,y),照度分量0< i(x,y)< ∞ ,反射分量0 <r(x,y)〈1.7.图像数字化:将一幅画面转化成计算机能处理的形式——数字图像的过程。
它包括采样和量化两个过程。
像素的位置和灰度就是像素的属性。
8.将空间上连续的图像变换成离散点的操作称为采样。
采样间隔和采样孔径的大小是两个很重要的参数。
采样方式:有缝、无缝和重叠。
9.将像素灰度转换成离散的整数值的过程叫量化。
10.表示像素明暗程度的整数称为像素的灰度级(或灰度值或灰度)。
11.数字图像根据灰度级数的差异可分为:黑白图像、灰度图像和彩色图像。
12.采样间隔对图像质量的影响:一般来说,采样间隔越大,所得图像像素数越少,空间分辨率低,质量差,严重时出现像素呈块状的国际棋盘效应;采样间隔越小,所得图像像素数越多,空间分辨率高,图像质量好,但数据量大。
13.量化等级对图像质量的影响:量化等级越多,所得图像层次越丰富,灰度分辨率高,图像质量好,但数据量大;量化等级越少,图像层次欠丰富,灰度分辨率低,会出现假轮廓现象,图像质量变差,但数据量小.但在极少数情况下对固定图像大小时,减少灰度级能改善质量,产生这种情况的最可能原因是减少灰度级一般会增加图像的对比度。
例如对细节比较丰富的图像数字化.14.数字化器组成:1)采样孔:保证单独观测特定的像素而不受其它部分的影响。
2)图像扫描机构:使采样孔按预先确定的方式在图像上移动。
XXXXXXXX 大学(数字图形处理)实验报告 实验名称 图像的平滑与锐化 实验时间 年 月 日专 业 姓 名 学 号 预 习 操 作 座 位 号 教师签名 总 评一、实验目的:1.了解图像平滑的邻域平均和中值滤波以及锐化的梯度法和Sobel 法的基本思想;2.掌握图像平滑的邻域平均和中值滤波以及锐化的梯度法和Sobel 法的基本步骤;二、实验原理:1. 邻域平均法的思想是用像素及其指定邻域内像素的平均值或加权平均值作为该像素的新值,以便去除突变的像素点,从而滤除一定的噪声。
邻域平均法的数学含义可用下式表示:∑∑==⎪⎭⎫ ⎝⎛=mn i imn i i i w z w y x g 11),( (1) 上式中:i z 是以),(y x 为中心的邻域像素值;i w 是对每个邻域像素的加权系数或模板系数; m n 是加权系数的个数或称为模板大小。
邻域平均法中常用的模板是:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡*=11111111191Box T (2) 为了解决邻域平均法造成的图像模糊问题,采用阈值法(又叫做超限邻域平均法,如果某个像素的灰度值大于其邻域像素的平均值,且达到一定水平,则判断该像素为噪声,继而用邻域像素的均值取代这一像素值;否则,认为该像素不是噪声点,不予取代),给定阈值0T :⎩⎨⎧≥-<-=00),(),(),(),(),(),(),(T y x g y x f y x g T y x g y x f y x f y x h (3) (3)式中,),(y x f 是原始含噪声图像,),(y x g 是由(1)式计算的平均值,),(y x h 滤波后的像素值。
2.中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。
方法是去某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。
图像平滑化处理邻域平均法C语言实现图像平滑化处理邻域平均法C语言实现邻域平均法是简单的空域图像平滑化处理方法,对图像噪声的去除有一定的效果。
#ifndef BMP_H_4_INCLUDED#define BMP_H_4_INCLUDED typedef unsigned short WORD;typedef unsigned long DWORD;typedef long LONG;typedef unsigned char BYTE;typedef struct tagBITMAPFILEHEADER{//bmfh WORD bfType;DWORD bfSize;WORD bfReserved1;WORD bfReserved2;DWORDbfOffBits;}BITMAPFILEHEADER;typedef struct tagBITMAPINFOHEADER{//bmih DWORD biSize;LONG biWidth;LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORDbiClrImportant;}BITMAPINFOHEADER;typedef struct tagRGBQUAD{//rgbq BYTE rgbBlue;BYTE rgbGreen;BYTE rgbRed;BYTE rgbReserved;}RGBQUAD;typedef struct tagBITMAPINFO{BITMAPINFOHEADER bmiHeader;RGBQUAD bmiColors[1];}BITMAPINFO;#include stdio.h#include stdlib.h#include string.h#includemalloc.h#include ctype.h#include process.h#include"BMP_4.h"BITMAPFILEHEADER bmfh;BITMAPINFOHEADER bmih;BYTE*imgData;void readData();int ReadFileHeader(BITMAPFILEHEADER*);int ReadInfoHeader(BITMAPINFOHEADER*);int CreatePalette(RGBQUAD);int ReadPixelData(BYTE*);LONG GetLineBytes(int,int);voidNeighborAverage(double);int SaveAsImage(char*);int main(){int i;char saveasfilepath[256];DWORD dwLineBytes;double Error;readData();printf("Input dwLineBytes=GetLineBytes(bmih.biWidth,bmih.biBitCount);error~\n");scanf("%f",&Error);NeighborAverage(Error);printf("Save as another path(ex.d:;scanf("%s",saveasfilepath);//poon.bmp)\n")i=SaveAsImage(saveasfilepath);if(i==-1){printf("Error:failed ton");}return 0;} save the image.\void readData(){int i,k,h;DWORD dwLineBytes;i=ReadFileHeader(&bmfh);if(i==0){printf("Read file header successful~\n");}k=ReadInfoHeader(&bmih);if(k==0){printf("Read info headersuccessful~\n");}dwLineBytes=GetLineBytes(bmih.biWidth,bmih.biBitCount);imgData=(BYTE*)malloc(dwLineBytes*bmih.biHeight*sizeof(BYTE));h=ReadPixelData(i mgData);if(h==0){printf("Read pixel data successful~\n");}if(i==0&&k==0&&h==0){printf("Read datas successful~\n");}}int ReadFileHeader(BITMAPFILEHEADER*bmfh){FILE*dataFile;dataFile=fopen("shuaige.bmp","r");if(fread(&bmfh-bfType,sizeof(WORD),1,dataFile)~=1){printf("Can not read bfType in the file header.\n");fclose(dataFile);return-1;}if(fread(&bmfh-bfSize,sizeof(DWORD),1,dataFile)~=1){printf("Can not read bfSize in the file header.\n");fclose(dataFile);return-1;} if(fread(&bmfh-bfReserved1,sizeof(WORD),1,dataFile)~=1){printf("Can not read bfReserved1 in the file header.\n");fclose(dataFile);return-1;}if(fread(&bmfh-bfReserved2,sizeof(WORD),1,dataFile)~n");=1){printf("Can not read bfReserved2 in the file header.\fclose(dataFile);return-1;}if(fread(&bmfh-bfOffBits,sizeof(DWORD),1,dataFile)~=1){printf("Can not read bfOffBits in the file header.\n");return-1;} fclose(dataFile);fclose(dataFile);return 0;}int ReadInfoHeader(BITMAPINFOHEADER*bmih){FILE*dataFile;dataFile=fopen("shuaige.bmp","r");fseek(dataFile,14,SEEK_SET);if(fread(&bmih-biSize,sizeof(DWORD),1,dataFile)~=1){printf("Can not read biSize in the info header.\n");fclose(dataFile);return-1;} if(fread(&bmih-biWidth,sizeof(LONG),1,dataFile)~=1){printf("Can not read biWidth in the info header.\n");fclose(dataFile);return-1;}if(fread(&bmih-biHeight,sizeof(LONG),1,dataFile)~=1){printf("Cannot read biHeight in the info header.\n");fclose(dataFile);return-1;} if(fread(&bmih-biPlanes,sizeof(WORD),1,dataFile)~=1){printf("Cannot read biPlanes in the info header.\n");fclose(dataFile);return-1;} if(fread(&bmih-biBitCount,sizeof(WORD),1,dataFile)~=1){printf("Cannot read biBitCount in the info header.\n");fclose(dataFile);return-1;} if(fread(&bmih-biCompression,sizeof(DWORD),1,dataFile)~n");=1){printf("Can not read biCompression in the info header.\fclose(dataFile);return-1;}if(fread(&bmih-biSizeImage,sizeof(DWORD),1,dataFile)~n");=1){printf("Can not read biSizeImage in the info header.\fclose(dataFile);return-1;}if(fread(&bmih-biXPelsPerMeter,sizeof(LONG),1,dataFile)~=1){printf("Can not read biXPelsPerMeter in the infoheader.\n");fclose(dataFile);return-1;}if(fread(&bmih-biYPelsPerMeter,sizeof(LONG),1,dataFile)~=1){printf("Can not read biYPelsPerMeter in the infoheader.\n");fclose(dataFile);return-1;}if(fread(&bmih-biClrUsed,sizeof(DWORD),1,dataFile)~=1){printf("Cannot read biClrUsed in the info header.\n");fclose(dataFile);return-1;} if(fread(&bmih-biClrImportant,sizeof(DWORD),1,dataFile)~=1){printf("Can not read biClrImportant in the infoheader.\n");fclose(dataFile);return-1;}fclose(dataFile);return 0;}int CreatePalette(RGBQUAD pal){int i;if(sizeof(pal)/sizeof(RGBQUAD)~=256){printf("The size of thepalette must be 256.\n");return-1;}for(i=0;i256;i++){pal[i].rgbBlue=i;pal[i].rgbGreen=i;pal[i].rgbRed=i;pal[i].rgbRe served=0;}return 0;}int ReadPixelData(BYTE*imgData){BYTE*data;FILE*dataFile;DWORD dwLineBytes;dwLineBytes=GetLineBytes(bmih.biWidth,bmih.biBitCount);data=(BYTE*)m alloc(dwLineBytes*bmih.biHeight*sizeof(BYTE));dataFile=fopen("shuaige.bm p","rb");fseek(dataFile,bmfh.bfOffBits,SEEK_SET);if(fread(data,dwLineBytes*bmih.biHeight*sizeof(BYTE),1,dataFile)~=1){printf("Can not read the pixel data.\n");free(data);return-1;} fclose(dataFile);memcpy(imgData,data,dwLineBytes*bmih.biHeight*sizeof(BYTE));free(dat a);fclose(dataFile);return 0;}LONG GetLineBytes(int imgWidth,intbitCount){return(imgWidth*bitCount+31)/32*4;}void NeighborAverage(double Error){int dwLineBytes;int NewdwLineBytes;int NewHeight;BYTE*NewData;double gray;int i,j;dwLineBytes=GetLineBytes(bmih.biWidth,bmih.biBitCount);NewdwLineByte s=dwLineBytes+2;NewHeight=bmih.biHeight+2;NewData=(BYTE*)malloc(NewdwLin eBytes*NewHeight*sizeof(BYTE));for(i=0;i NewHeight;i++){for(j=0;j NewdwLineBytes;j++){NewData[NewdwLineBytes*i+j]=0;}}for(i=0;i bmih.biHeight;i++){for(j=0;j dwLineBytes;j++){NewData[NewdwLineBytes*(i+1)+j+1]=imgData[dwLineBytes*i+j];}} for(i=1;i NewHeight-1;i++){for(j=1;j NewdwLineBytes-1;j++){gray=(double)(NewData[NewdwLineBytes*(i-1)+j-1]+NewData[NewdwLineBytes*i+j-1]+NewData[NewdwLineBytes*(i+1)+j- 1]+NewData[NewdwLineBytes*(i-1)+j]+NewData[NewdwLineBytes*(i+1)+j]+NewData[NewdwLineBytes*(i-1)+j+1]+NewData[NewdwLineBytes*i+j+1]+NewData[NewdwLineBytes*(i+1)+j +1])/8;if(abs((double)(NewData[NewdwLineBytes*i+j])-gray)Error){imgData[dwLineBytes*(i-1)+j-1]=(int)gray;}}}} int SaveAsImage(char*filepath){FILE*dataFile;RGBQUAD pal[256];int i;DWORD dwLineBytes;dwLineBytes=GetLineBytes(bmih.biWidth,bmih.biBitCount);dataFile=fopen(filepath,"wb");if(~dataFile){printf("Error:Cannot open the file:%s\n",filepath);return-1;}for(i=0;i 256;i++){pal[i].rgbReserved=0;pal[i].rgbBlue=i;pal[i].rgbGreen=i;pal[i].rgbRed=i;}if(fwrite(&bmfh.bfType,sizeof(WORD),1,dataFile)~=1){printf("Can not write bfType in the file header.\n");fclose(dataFile);return- 1;}if(fwrite(&bmfh.bfSize,sizeof(DWORD),1,dataFile)~=1){printf("Can not write bfSize in the file header.\n");fclose(dataFile);return- 1;}if(fwrite(&bmfh.bfReserved1,sizeof(WORD),1,dataFile)~=1){printf("Can not write bfReserved1 in the file header.\n");fclose(dataFile);return-1;}if(fwrite(&bmfh.bfReserved2,sizeof(WORD),1,dataFile)~=1){printf("Can not write bfReserved2 in the file header.\n");fclose(dataFile);return-1;}if(fwrite(&bmfh.bfOffBits,sizeof(DWORD),1,dataFile)~=1){printf("Can not write bfOffBits in the fileheader.\n");fclose(dataFile);return-1;}if(fwrite(&bmih.biSize,sizeof(DWORD),1,dataFile)~=1){printf("Can not write biSize in the info header.\n");fclose(dataFile);return-1;}if(fwrite(&bmih.biWidth,sizeof(LONG),1,dataFile)~=1){printf("Can not write biWidth in the info header.\n");fclose(dataFile);return-1;}if(fwrite(&bmih.biHeight,sizeof(LONG),1,dataFile)~=1){printf("Can not write biHeight in the info header.\n");fclose(dataFile);return- 1;}if(fwrite(&bmih.biPlanes,sizeof(WORD),1,dataFile)~=1){printf("Can not write biPlanes in the infoheader.\n");fclose(dataFile);return-1;}if(fwrite(&bmih.biBitCount,sizeof(WORD),1,dataFile)~=1){printf("Can not write biBitCount in the infoheader.\n");fclose(dataFile);return-1;}if(fwrite(&bmih.biCompression,sizeof(DWORD),1,dataFile)~=1){printf("Can not write biCompression in the infoheader.\n");fclose(dataFile);return-1;}if(fwrite(&bmih.biSizeImage,sizeof(DWORD),1,dataFile)~=1){printf("Can not write biSizeImage in the infoheader.\n");fclose(dataFile);return-1;}if(fwrite(&bmih.biXPelsPerMeter,sizeof(LONG),1,dataFile)~=1){printf("Can not write biXPelsPerMeter in the infoheader.\n");fclose(dataFile);return-1;}if(fwrite(&bmih.biYPelsPerMeter,sizeof(LONG),1,dataFile)~=1){printf("Can not write biYPelsPerMeter in the infoheader.\n");fclose(dataFile);return-1;}if(fwrite(&bmih.biClrUsed,sizeof(DWORD),1,dataFile)~=1){printf("Can not write biClrUsed in the info header.\n");fclose(dataFile);return-1;}if(fwrite(&bmih.biClrImportant,sizeof(DWORD),1,dataFile)~=1){printf("Can not write biClrImportant in the infoheader.\n");fclose(dataFile);return-1;}if(bmih.biBitCount==8){if(fwrite(pal,sizeof(RGBQUAD),256,dataFile )~=256){printf("Error:can not write the colorpalette.\n");fclose(dataFile);return-1;}}if(fwrite(imgData,bmih.biHeight*dwLineBytes,1,dataFile)~=1){printf("Error:can not write the pixeldata.\n");fclose(dataFile);return-1;}fclose(dataFile);printf("Save As the image successfully.\n");return 0;}下面是对程序的简单验证:原图平滑处理后的图像。
一、超限像素平滑法
I=imread('m3.png');
I=rgb2gray(I);
subplot(2,2,1),imshow(I);
[m,n]=size(I);
l=3;%模版尺寸
L=ones(l);%l*l模版
S=ones(m-l+1,n-l+1);
for i=1:m-l+1
for j=1:n-l+1
S(i,j)=1/(l*l)*sum(sum(I(i:i+l-1,j:j+l-1)));%求平均
end
end
subplot(2,2,2),imshow(S,[]);
P=imnoise(I,'salt & pepper',0.05);%加入椒盐躁声
subplot(2,2,3),imshow(P);
T=30;%设置阈值
A=P;
for i=1:m-2
for j=1:n-2
if (abs(P(i,j)-S(i,j))>T)
A(i,j)=P(i,j);
else
A(i,j)=S(i,j);
end
end
end
subplot(2,2,4),imshow(A);
思路:获取原始图像的灰度图与大小(m,n),假设一个方阵模版和(m-1,n-1)的矩阵,将方阵在图像上移动,每移动一次进行一次方阵大小范围内的平均值运算,得到由平均值组成的矩阵S,引入椒盐噪声函数,设定滤波阈值T,当灰度值与平均值的差大于阈值时,该点像素值保持不变,否则,取平均值。
程序结果:
体会:模版方阵在图像上移动,实质上是卷积运算,如何让模版方阵在图像移动,for语句的循环条件就需要计算准确。
后面的滤波使用选择语句即可。
二、灰度最相近的K个邻点平均法
I=imread('m3.png');
I=rgb2gray(I);
I=im2double(I);
[m,n]=size(I);
for i=2:m-1
for j=2:n-1
I1=I(i-1,j-1)-I(i,j);%求邻域内的值与中心值的差值
I2=I(i-1,j)-I(i,j);
I3=I(i-1,j+1)-I(i,j);
I4=I(i,j-1)-I(i,j);
I5=I(i,j)-I(i,j);
I6=I(i,j+1)-I(i,j);
I7=I(i+1,j-1)-I(i,j);
I8=I(i+1,j)-I(i,j);
I9=I(i+1,j+1)-I(i,j);
G=[I1,I2,I3,I4,I5,I6,I7,I8,I9]; %将差值保存在数组里
A=abs(G); %取绝对值
H=[1,2,3,4,5,6,7,8,9;A];
for s=1:9%使用for循环进行排序
for g=s+1:9
if H(2,s)>H(2,g)
MID=H(1,s);
H(1,s)=H(1,g);
H(1,g)=MID;
mid=H(2,s);
H(2,s)=H(2,g);
H(2,g)=mid;
end
end
end
K(1)=A(H(1,1));
K(2)=A(H(1,2));
K(3)=A(H(1,3));
K(4)=A(H(1,4));
K(5)=A(H(1,5));
K(6)=A(H(1,6));
K(7)=A(H(1,7));
ave=(K(1)+K(2)+K(3)+K(4)+K(5)+K(6)+K(7))/7; %排序后的结果存入K中,取差值的前七个求平均值
X(i,j)=ave;
end
end
E=im2uint8(X);
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(E);
效果图:
体会:程序的关键在于,取邻域和排序,排序之后,差值有九个,取K 值,较小的K 值使噪声方差下降较小,但保持细节效果较好;而较大的K 值平滑噪声较好,但会使图像边缘模糊。