中值滤波器设计及椒盐噪声滤除
基于中值滤波的椒盐含噪图像去噪方法
Z H A N G D o n g , Q I N F e n g q i n g , C A O L e i , L I U S h u j u n ( S c h o o l o f C o m p u t e r &l n f o r ma a o n E n g i n e e r i n g , Y i b i n U n i v e r s i t y , Y i b i n , S i c h u a n 6 4 4 0 0 7 , C h i a )
第1 4 卷第 6 期
Vo I . 1 4 . No . 6
宜 宾 学 院 学 报
J o u r n a l o f Yi b i n Un i v e r s i t y
2 0 1 4年 6月
J u n e , 2 01 4
基 于 中值 滤 波 的椒 盐 含 噪 图像 去 噪 方 法
Re s e a r c h o n I ma g e De 。 n o i s i ng Me t h o ds wi t h S a l t a n d P e p p e r No i s e B a s e d o n Me d i a n Fi l t e r i n g
张 东,覃凤 清 ,曹 磊 ,刘 书君
( 宜宾学院 计算机 与信息工 程学 院 ,l  ̄ l J l l 宜宾 6 4 4 0 0 7 )
摘 要 :为 了有效地去除 图像 中的椒盐噪声 , 提 高图像的质量 , 利用 中值 滤波 算法进行 去噪 处理 .分析 了椒盐噪声 的特性 , 阐述 了 中 值 滤波算法 的去噪原 理和优缺点. 通过 实验从主观评 价和客观评价 两方面对 比 了中值 滤波和几种 典型的 图像去噪 方法对椒 盐噪 声 的去噪效果 , 并进一 步分析 了不 同窗 口大小的 中值 滤波对椒 盐噪 声的去噪 效果 . 实验结果表 明 , 中值 滤波算法能很好地 去除 图像 中 的椒 盐噪声. 关键 词 :噪声 ; 椒 盐噪声 ; 图像去噪 ; 中值 滤波 中图分类号 :T P 3 9 1 文献标志码 :A 文章 编号 :1 6 7 1 — 5 3 6 5 ( 2 0 1 4 ) 0 6 — 0 1 0 8 — 0 3
自适应中值滤波器的设计与实现
自适应中值滤波器的设计与实现中值滤波器是一种常用的图像降噪滤波器,可以有效地去除图像中的椒盐噪声。
而自适应中值滤波器则是在传统中值滤波器的基础上进行改进,能够在保持图像细节的同时更好地去除噪声。
本文将介绍自适应中值滤波器的设计原理和实现方法。
一、自适应中值滤波器的设计原理具体来说,自适应中值滤波器的设计原理如下:1.设定滤波窗口的大小和初始值。
2.对于滤波窗口内的像素,按照灰度值进行排序,找到中间值,即中心像素点。
3.计算滤波窗口内的最大灰度值和最小灰度值,并计算其差值。
4.判断中心像素点是否为椒盐噪声,如果是,则将中心像素点的灰度值设置为滤波窗口内的中值,即进行中值滤波。
5.如果中心像素点不是椒盐噪声,则将滤波窗口的大小加1,并重新执行步骤2-4,直到找到合适的滤波窗口大小。
二、自适应中值滤波器的实现方法1.读入待处理的图像,并设定滤波窗口的大小和初始值。
2.对图像的每个像素点都进行以下操作:a.获取滤波窗口内的像素,并按照灰度值进行排序。
b.找到滤波窗口内的中心像素点。
c.计算滤波窗口内的最大灰度值和最小灰度值,并计算其差值。
d.判断中心像素点是否为椒盐噪声,如果是,则将中心像素点的灰度值设置为滤波窗口内的中值,即进行中值滤波。
e.如果中心像素点不是椒盐噪声,则将滤波窗口的大小加1,并重新执行步骤a-d,直到找到合适的滤波窗口大小。
3.输出处理后的图像。
三、自适应中值滤波器的优缺点及应用自适应中值滤波器在图像处理领域有广泛的应用。
它可以应用于数字图像处理、计算机视觉、医学影像等领域,用于去除图像中的椒盐噪声,提高图像质量。
此外,自适应中值滤波器还可以用于图像分割、边缘检测等任务中,以改进算法的鲁棒性和准确性。
总结起来,自适应中值滤波器是一种有效的图像降噪滤波器,在保持图像细节的同时能够较好地去除噪声。
其设计原理是基于中值滤波器的改进,通过对滤波窗口内像素灰度值的分析来决定中心像素点是否进行中值滤波。
椒盐噪声和中值滤波
Salt-and-pepper noise1.产生椒盐噪声在图像中随机选取6000个点,3000设为白色,3000个设为黑色,产生椒盐噪声%----------------------------------------------------------------------------------------------------------------------------% %----------------------------------------------------------------------------------------------------------------------------% #include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>#include<cv.h>void salt(cv::Mat &image,int n){for(int k=0;k<n;k++){int i=rand()%image.cols;int j=rand()%image.rows;if(image.channels()==1){image.at<uchar>(j,i)=255;}else if (image.channels() == 3) {image.at<cv::Vec3b>(j,i)[0]= 255;image.at<cv::Vec3b>(j,i)[1]= 255;image.at<cv::Vec3b>(j,i)[2]= 255;}}//产生3000个白点for(int k=0;k<n;k++){int i=rand()%image.cols;int j=rand()%image.rows;if(image.channels()==1){image.at<uchar>(j,i)=0;}else if (image.channels() == 3) {image.at<cv::Vec3b>(j,i)[0]= 0;image.at<cv::Vec3b>(j,i)[1]= 0;image.at<cv::Vec3b>(j,i)[2]= 0;}}}//产生3000个黑点int main(){cv::Mat image;image = cv::imread("lena.jpg");salt(image,3000);cv::namedWindow("WK");cv::imshow("WK",image);cv::waitKey(0);return 1;}%----------------------------------------------------------------------------------------------------------------------------% %----------------------------------------------------------------------------------------------------------------------------%2.中值滤波利用opencv中的cvSmooth对图像进行中值滤波。
毕业论文-基于中值滤波的图像椒盐噪声滤除算法的研究与应用
本科生毕业论文(设计)题目:基于中值滤波的图像椒盐噪声滤除算法的研究与应用院系:信息科学与技术学院专业:计算机科学与技术学生姓名:**学号:********指导教师:罗笑南(教授)(职称)二〇年月基于中值滤波的图像椒盐噪声滤除算法的研究与应用摘要摘要在现实生活中,将实际获得的图像进行数字化,并在其传输和处理过程中,不可避免的存在着一定的外部干扰和内部干扰,使用户所获得的数字图像被噪声污染,而这些噪声中椒盐噪声的表现更为明显。
为此有大量学者针对椒盐噪声进行研究分析。
中值滤波算法以其非线性的特点,在处理椒盐噪声上有显著的效果,因此许多学者针对中值滤波算法进行改进。
典型的如加权中值滤波器、开关中值滤波器、自适应中值滤波器等。
然而这些滤波器或在保护图像细节上能力不足,或去除噪声效果不佳,或对于高密度噪声无法处理,或过于复杂不便于硬件实现,存在着一定的缺陷。
本文研究了几种典型的改进后的中值滤波算法,通过理论分析与实验仿真,比较其在去噪及保护图像细节各方面的优缺点。
在此基础上,本文给出了一种基于噪声检测的模糊自适应中值滤波算法。
在该算法中,通过设计窗口自适应的噪声检测机制,有效的区分了噪声与非噪声像素点,从而高效的保护了图像细节信息,并大量减少需要处理的像素点,降低算法运行时间。
同时对于检测出的噪声点,则采用改进了的自适性中值滤除算法进行噪声滤除,在该滤波算法中加入了窗口自适应控制,对于高密度噪声也能有效的进行去噪处理。
通过详细的理论分析后,本文基于matlab进行大量仿真实验,验证了这些新方法在噪声去除与细节保留上的有效性。
关键词:图像去噪、椒盐噪声、噪声检测、自适应中值滤波、开关阈值滤波AbstractThe acquisition, recording and transmission of digital images through sensors or communication channels are often interfered by different types of noises, which may change the image. Impulse noise is one most common and important kind of noise. Impulse noise removal in image processing is an important pre-processing so that many researchers work on the restoration of images corrupted by impulse noise. Being the most popular nonlinear filter, the median filter is often used to remove impulse noise because of its good denoising power. In that case, many image-denoising filters are proposed based on the median filter, such as the weighted median filter, soft switching filter, adaptive median filter, etc.In this paper, a new image-denoising filter that is based on several advanced median filter is proposed. There is a two-phase scheme in this new algorithm. In the first phase, an impulse noise detection is used to identify pixels which are likely to be noise candidates. The noise detection has variable window size for removal of impulses, so that we can keep most of the signal content of the uncorrupted pixels, and time used for filtering can be reduced by a wide margin. In the second phase, the noise candidates will be filtered by the new filter. Based on the adaptive median filter, the proposed filter is superior to some other filters mentioned in this paper not only for smooth pictures but also images that are complicated and have many sharp edges. Being incorporated with variable windows size, our method is also very useful for images with high noise level.Key Words:image denoising, salt-and-pepper noise, adaptive median filter,impulse noise detector, switching-based median filter目录第一章引言 (1)1.1课题背景及其意义 (1)图像滤波技术概述 (1)中值滤波研究现状 (2)本论文的主要工作 (3)1.3论文章节安排 (4)第二章图像去噪算法综述 (5)2.1图像去噪方法概述 (5)2.2图像噪声模型 (6)2.3图像去噪质量的评估方法 (7)2.4中值滤波 (8)2.5维纳滤波 (9)2.6均值滤波 (11)2.7其他滤波技术 (12)2.8小结 (13)第三章几种中值滤波去噪方法分析 (14)3.1标准中值滤波方法(STANDARD MEDIAN FILTER,SM) (14)3.2带权值的中值滤波方法(WEIGHTED MEDIAN FILTER) (15)3.3三态中值滤波方法(TRI-STATE MEDIAN FILTER) (17)3.4自适应软开关滤波方法 (18)3.5自适应中值滤波方法 (20)3.6实验结果分析 (21)3.7小结 (26)第四章基于噪声检测的自适应中值滤波 (27)4.1噪声检测机制 (27)4.2椒盐噪声滤除方法 (33)4.2.1 噪声滤除策略 (34)4.2.2 动态窗口策略 (35)4.2.3 VAM滤波方法 (37)4.3小结 (37)第五章仿真结果分析比较 (39)5.1噪声检测机制性能分析 (39)5.2V AM滤波器去噪效果分析 (41)5.3小结 (45)第六章结语 (46)6.1论文主要工作总结 (46)6.2展望 (46)参考文献 (48)致谢 (50)第一章引言1.1 课题背景及其意义冈萨雷斯曾在其著作中提到,视觉是人类感觉中最高级的,而图像又在人类的感知中起着重要的作用[1]。
几种中值滤波去噪方法分析
几种中值滤波去噪方法分析在数字图像的转换、存储和传输等过程中,经常性由于电子设备工作环境的不稳定,由于设备中含有一些污染物等原因,导致数字图像中一些像素点的灰度值发生非常大的变化,变得非常小或者非常大;而且大气环境很容易干扰无线数据传输,从而让传输信号混入噪声,接收到的无线信号恢复成传输过来的数字图像较原图像相比也会有很大的不同。
在这些过程中,椒盐噪声很容易就会对数字图像造成感染。
客户满意的数字图像尽可能少或者没有受到椒盐噪声的污染。
所以我们需要去噪处理。
在现阶段处理椒盐噪声方面的研究成果方面,因为中值滤波有其非线性的特性,对比其他线性滤波方法可以取得更好的效果,同切同时还可以更好的保留图像的边缘信息。
很多学者在研究通过中值滤波消除椒盐噪声的影响,希望可以得到更好的去噪效果。
第一节标准中值滤波方法标准中值滤波是把这个窗口内的像素点按灰度值大小进行排列,把灰度值的平均值当作标准值。
我们以一个8位的图像作为例子,因为椒盐噪声会让受影响的像素点灰度值改为亮点,即灰度值为255;或者暗点,即灰度值为0。
我们在排序的时候,把收到污染的像素点的灰度值大小排列出来,取中间值为所有噪点值,那么就可以消除噪声污染对这个点的影响。
其具体步骤如下:①把窗口在图像中滑动,然后让窗口中心与某一像素点重合②记录下窗口中所有像素点的灰度值③将这些灰度值从小到大排序④记录下该灰度值序列中间的值⑤将所记录下的中间值替代窗口中心像素点的灰度值因为中值滤波的输出灰度值大小是由窗口的中值大小所决定的,所以中值滤波对于窗口内脉冲噪声远远没有均值滤波敏感。
因此相对于均值滤波,中值滤波可以在有效去除脉冲噪声的同时,减小更多的模糊图像。
由于由于中值滤波所采用的窗口大小会直接决定去噪效果和图像模糊程度,而且图像去噪后的用途也就决定了窗口的形式。
以5*5窗口为例,常见的形状如图2.1所示:图 2.1 常见的尺寸为5*5的中值滤波窗口尽管标准中值滤波方法称得上是现在市面上的一种最简单有效的去除椒盐噪声的方法。
用中值滤波滤除图像中的椒盐噪声
数字图像处理作业系别:班级:姓名:学号:论文:影响系统图像清晰程度的因素很多,例如室外光照度不够均匀就会造成图像灰度过于集中;由CCD(摄像头)获得的图像经过A/D(数/模转换,该功能在图像系统中由数字采集卡来实现)转换、线路传送都会产生噪声污染等等。
因此图像质量不可避免的降低了,轻者表现为图像不干净,难于看清细节;重者表现为图像模糊不清,连概貌也看不出来。
因此,在对图像进行分析之前,必须要对图像质量进行改善,一般情况下改善的方法有两类:图像增强和图像复原。
图像增强( image enhancement ),定义是将原来不清晰的图像变得清晰或强调某些关注的特征,抑制非关注的特征,使之改善图像质量、丰富信息量,加强图像判读和识别效果的图像处理方法。
增强图像中的有用信息,它可以是一个失真的过程,其目的是要改善图像的视觉效果,针对给定图像的应用场合,有目的地强调图像的整体或局部特性,将原来不清晰的图像变得清晰或强调某些感兴趣的特征,扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,使之改善图像质量、丰富信息量,加强图像判读和识别效果,满足某些特殊分析的需要。
图像增强可分成两大类:频率域法和空间域法。
前者把图像看成一种二维信号,对其进行基于二维傅里叶变换的信号增强。
采用低通滤波(即只让低频信号通过)法,可去掉图中的噪声;采用高通滤波法,则可增强边缘等高频信号,使模糊的图片变得清晰。
具有代表性的空间域算法有局部求平均值法和中值滤波(取局部邻域中的中间像素值)法等,它们可用于去除或减弱噪声。
图像增强的方法是通过一定手段对原图像附加一些信息或变换数据,有选择地突出图像中感兴趣的特征或者抑制(掩盖)图像中某些不需要的特征,使图像与视觉响应特性相匹配。
在图像增强过程中,不分析图像降质的原因,处理后的图像不一定逼近原始图像。
图像增强技术根据增强处理过程所在的空间不同,可分为基于空域的算法和基于频域的算法两大类。
中值滤波器算法
中值滤波器算法中值滤波器算法是一种常用的图像处理算法,用于去除图像中的噪声。
噪声是图像中不希望存在的干扰信号,可能由于图像采集过程中的电磁干扰、传感器的噪声或信号传输过程中的干扰等原因引起。
噪声会使得图像失真,降低图像的质量和清晰度,因此需要进行去噪处理。
中值滤波器算法的基本思想是将图像中的每个像素点的灰度值替换为该像素点周围邻域中灰度值的中值。
这样可以有效地去除噪声,并保持图像的边缘和细节信息。
中值滤波器算法的具体步骤如下:1. 对图像进行扫描,遍历图像中的每个像素点。
2. 对于每个像素点,选择一个固定大小的邻域窗口,该窗口覆盖了该像素点及其周围的像素。
3. 将窗口中的所有像素的灰度值按照大小进行排序,找到排序后的中间值。
4. 将该中间值作为该像素点的新灰度值。
5. 重复步骤2到步骤4,直到遍历完所有像素点。
中值滤波器算法的核心在于选择合适的窗口大小。
窗口大小的选择会影响去噪的效果和图像的细节保留程度。
如果窗口过小,可能无法去除大尺度的噪声;如果窗口过大,可能会导致图像细节的模糊。
因此,在实际应用中需要根据具体情况进行选择。
中值滤波器算法具有以下优点:1. 对于椒盐噪声等随机噪声有较好的去噪效果,能够有效地去除噪声点。
2. 不会引入新的噪声,保持图像的边缘和细节信息。
3. 算法简单,计算速度快,适用于实时处理和嵌入式系统。
然而,中值滤波器算法也存在一些局限性:1. 对于高斯噪声等连续分布的噪声效果较差,无法完全去除噪声。
2. 窗口大小的选择需要根据具体情况进行调整,调整不当可能会导致图像细节的丢失或模糊。
3. 算法无法区分图像中的目标和噪声,可能会将目标的细节也平滑掉。
为了提高中值滤波器算法的去噪效果,可以结合其他滤波方法进行优化。
例如,可以先使用高斯滤波器对图像进行平滑处理,然后再应用中值滤波器进行去噪。
这样可以兼顾去噪效果和图像细节的保留。
中值滤波器算法是一种简单且有效的图像去噪方法。
通过选择合适的窗口大小,可以去除图像中的噪声,提高图像的质量和清晰度。
中值滤波器设计及椒盐噪声滤除
题目四:中值滤波器设计及椒盐噪声滤除一、实验背景在数字图像的生成与采集过程中,由于受工作环境,器件等性能的影响,使得一幅未经处理的原始图像,都存在着一定的噪声干扰。
这种噪声具有以下性质:1、图像上的噪声出现处呈现不规则分布;2、噪声的大小也是不规则的。
这些噪声恶化了图像质量,使图像模糊甚至淹没目标特征,给后续的处理分析带来了困难。
因此需要对图像应该进行滤除噪声处理。
二、 实验目的1. 通过利用c 程序实现数字信号处理的相关功能,巩固对信号处理原理知识的理解,培养快速解决实际问题的能力提高实际编程和处理数据的综合能力,初步培养在解决信号处理实际应用问题中所应具备的基本素质和要求。
2. 培养独立思考的能力与研发能力,通过设计实现不同的信号处理问题,初步掌握在给定条件和功能的情况下,实现合理设计算法结构的能力。
3. 提高资料查询和整理的能力。
能够在短时间内找到适合自己的方法。
并在文献整理的过程中学会科技文献的写作,提高语言表达能力。
三、 实验内容1. 理解什么是椒盐噪声,中值滤波的原理及其特性。
2. 设计一种中值滤波,对椒噪声滤波有效,并分析滤波器的适用范围。
3、(扩展训练)对设计的滤波器针对椒、盐噪声滤除分别进行测试,并进行性能比较分析,并讨论椒、盐噪声频度(噪声数目占图像实际像素的百分比)对滤波器实际效果的影响。
四、实验原理1.椒盐噪声椒盐噪声又称脉冲噪声,是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。
椒盐噪声往往由图像切割引起。
椒盐噪声的PDF 是:如果b>a ,灰度值b 在图像中将显示为一个亮点,a 的值将显示为一个暗点。
若或 为零,则脉冲噪声称为单级脉冲。
如果 和 均不为零,尤其是他们近似相等时,脉冲噪声值将类似于随机分布在图像上的胡椒和盐粉微粒。
()⎪⎩⎪⎨⎧===其他0b z P a z P z p b a a P b P a P b P形象的说,椒噪声在图像上是类似于黑胡椒颗粒的小点,而盐噪声在图像上是类似于白色盐粒的小点。
一种去除椒盐噪声的自适应开关中值滤波算法
a a t e s th me in f t r ga g rt m.W e u e ma — n o e ao st e n ie d t co r g e s ey s a e i g o lf t ih y d p i wi d a l i l o h v c i en i s x mi p r tra h o s e e trt p o r s i l e n t ma e f m e r tb o v h r t o g me n f d p i e n ih o r o d wid w,a d me n h l ic mi a e t e n ie o t e px l n c n r f h n o a s o a t eg b u h o n o a v n a w i ds r n t h os sf m h ie si e te o e wid w,a d t e le u e i r t n n f tro t h i
子作为噪声检测器 , 利用 自适应邻域 窗 口对 图像进行 从左到右的逐行扫描 , 同时对位于 窗 口中心 的像素 点进 行 噪声 判别 , 然后将检 测 出的噪声 点采用 中值滤 波进行 滤除, 而信 号点保持 不变直接输 出。实验仿真结果证 明 了该 算法 的有效性 。 关键词
中图分类号
法 。T M算法 由于可对椒盐 噪声起 到 良好 的平 滑效果且 可对 图
在传统 中值滤波 中, 有的像 素点都 采用统 一 的处 理方 法 所
即改变噪声点灰度值 的时候 , 会一 定程 度地 改变边缘 像素灰 度 值, 由于噪声点几 乎都是 邻域像 素 的极值 , 边缘不是 , 而 因此 可
第2 第 1 8卷 0期
2 1年 l 01 0月
计 算机 应 用与软 件
自适应中值滤波器的设计与实现
自适应中值滤波器的设计与实现自适应中值滤波器是一种基于信号的局部特性进行处理的滤波器。
它适用于在图像处理中去除椒盐噪声(salt and pepper noise)的任务。
椒盐噪声是一种随机噪声,它会在图像中产生亮或暗的像素点。
自适应中值滤波器的设计和实现可以分为以下几个步骤。
首先,我们需要定义一个滑动窗口的大小,以确定每次滤波的区域。
通常选择一个正方形的窗口,大小通常在3×3到7×7之间。
较小的窗口会导致噪声较少的图像细节损失,但也可能无法完全去除噪声。
较大的窗口可以去除更多的噪声,但可能会模糊图像。
接下来,我们需要确定中值滤波器的参数。
通常情况下,我们需要选择一个适当的阈值,来判断是否对像素进行滤波。
一个常用的阈值是像素值的标准差的倍数K,如果像素值与其领域的中值之间的差异超过K倍的标准差,则认为该像素是噪声。
为了更好地抑制噪声,阈值K通常选择较大的值。
然而,过大的阈值也可能会导致图像细节的损失。
一种常用的自适应中值滤波器算法是逐级嵌套。
首先使用较小的窗口进行滤波,然后根据滤波结果进行判断。
如果像素的灰度值与中值之间的差异大于阈值,则继续使用较大的窗口进行滤波,直到像素的灰度值与中值之间的差异小于阈值为止。
这种逐级嵌套的方法可以在保留图像细节的同时去除噪声。
在实现自适应中值滤波器时,可以使用编程语言如Python或MATLAB 来编写代码。
首先需要读取图像,并将图像转换为灰度图像。
然后,利用嵌套循环遍历每个像素,并在每个像素的领域内计算中值。
根据阈值判断是否对像素进行滤波,如果需要滤波,则继续使用较大的窗口进行滤波。
最后,将滤波结果保存为新的图像。
需要注意的是,自适应中值滤波器的设计和实现是一个复杂的任务,并且其性能和效果取决于所选择的参数和算法。
因此,在使用自适应中值滤波器时,需要根据具体的应用场景和需求进行适当的调整和优化,以达到较好的滤波效果。
用改进的自适应中值滤波去椒盐噪声
21 0 2年 8月
湖北警官学院学报
J ur a f Hu i o n l be v ri f Poie o Unie st o lc y
Au 2 2 g. 01 N o 8 e . . 31 . S rNo 1
第 8 总第 1 1 期 3 期
用改进 的 自适应 中值滤波去椒 盐噪声
节信 息, 会使 图像变模糊 , 甚至失真 。 基于 阈值法和分治法
改进 的 快速 自适 应 中值 滤 波 法 , 效 地 抑 制 了椒 盐 噪声 , 有 保
护 了图像边缘细节, 提高了滤波速度 , 减少了运行 时间 。
二、 自适 应 中值 滤 波 的 原 理 中值 滤 波 效 果 依 赖于 滤 波 窗 口 的大 小 , 大 会 模 糊边 太
Z 作 为 输 出 值 。
Lvl e e B: B1 Z 一 Z = — B2 =Z 一 Z
并且 A< , 0 转到 5, 否则, 增加滤窗 S 的尺寸。 ( 如果 s ≤s 时, 4 ) 扩大窗 口尺 寸, 并转到 2 重复 以 , 上步骤, 否则 , 当前窗 口均值 men 替换 当前点 。 用 aS
【 图分 类号 1 3 中 D6 1 【 文献 标 识码 】 A 【 章编 号 163 3 l 0 2O 一O 5 一O 文 17 —2 9( 1)8 16 2 2
一
、
引言
作为输 出值 。 上述滤波算法表 明: 该算法在噪声密度较小时, 滤波和
细节 保 持 效 果均 较好 ; 噪声 密度 大 于 5%时增 大 、 整 窗 若 0 调
如 果 B> 0并 且 B < , Z 为 输 出值 ,否 则把 Z 0 把 x 作
【 收稿 日期 】 O 2 5 8 2 l—0 —2
基于椒盐噪声的中值滤波法的使用
科学技术创新2020.10(转下页)基于椒盐噪声的中值滤波法的使用王辉(苏州科技大学天平学院,江苏苏州215100)图像作为人类感知世界的视觉基础,将信息转变为我们人类视觉化的认知。
但图像在获取和传播过程中通常会受到噪声的干扰,使得图像质量下降,为了使图像恢复原本的质量,获得更多的信息,我们需要图像去噪技术来对以及被噪声破坏的图像进行加工和处理。
1椒盐噪声的概念与特点噪声的物理学概念是指无规律的不具周期性特征的声响,主要分为高斯噪声,伽马噪声,椒盐噪声等(也成脉冲噪声)。
椒盐噪声由为盐噪声组成,是指使随机改变图像上的像素值,使得图像在二维平面上的像素点一些变白(盐噪声),一些点变黑(胡椒噪声),一般两种噪声同时出现,前者属于高灰度噪声,后者属于低灰度噪声。
椒盐噪声改变图像像素的灰度值,它出现的位置随机,并且灰度值固定。
记x 为未被椒盐噪声和其他噪声污染的原始图像,x (i ,j )记为x 所处坐标像素位置的灰度值,其灰度值的区间为[Smin ,Smax],且满足Smin<=x (i ,j )<=Smax 。
当图像被椒盐噪声污染后,其像素的灰度值变为椒盐噪声的灰度值。
2传统去椒盐噪声的方法及评价传统的去椒盐噪声的方法有均值滤波法和中值滤波法。
2.1均值滤波法均值滤波法:均值滤波法,又叫领域平均法,它是线性滤波的一种方法。
其原理是拿几个像素的灰度值来代替图片每个像素的灰度值。
一张M*N 的图片(用Xi ,j 表示图像X 在坐标(i ,j )上的像素灰度值,此时i ,j 属于A{(1,……M )×(1,……N )}),用3*3或5*5的正方形滤波窗口,以3*3为例,用3*3正方形滤波窗口将图像依次进行分割处理,将窗口内未处理的像素点为中心,还包括其周围的领域像素。
最后将模板全体像素的灰度平均值来代替原来每个像素的灰度。
评价:(1)中值滤波法在一定程度上抑制了噪声,但其原理是拿窗口内像素的平均灰度值来代替每一个像素的灰度值,导致了图像噪声分摊到每一个像素点上,使得图像变模糊,这是因为均值滤波法的原理导致的,只能改善。
一种滤除椒盐噪声的改进的中值滤波算法
我们采用 了直接输 出的处理方法 。
2 2 椒盐噪声检测 .
假设数字 图像 的像素 灰度 取值 空 间为 [ i, a] 对 Mn M x (
于 2 6级灰度 图像 , n= , x=2 5 , 于含 椒盐噪声 的 5 Mi接 近于 Mi Ma, 其 n或 x 表现为黑 的或 白的亮 斑 , 因此 , 们可 以定 义椒 盐噪声 点判 我
实上的椒盐噪声 点的可能性非常小 , 可能这些像素构成 的 很 是灰度值非常接近的平滑 区域 , 或者该像素是 与部分邻 域像 素灰度值相差较大的 图像边缘像素 , 因此 , 于这样 的像素 , 对
l 标 准 中值 滤波 算法
中值滤波器是一种常用的非线性 滤波器 , 其输 出像素值 是邻 域像素灰度 的中间值 。中值滤波 器的优点是 : 它可 以克 服线性滤波器给 图像带来的模糊 , 在有效地 清除颗粒噪声 的 同时 , 又保持 良好 的边缘特性 , 从而获 得较满意 的滤波效果 , 特别适合于消除图像的椒盐噪声点 。
本文根据椒盐噪声的特点 , 出了非常有效 的椒 盐噪声 提 像素检测算法—— 两极 门限检测法 , 并在此基础 上进一步提
出了一种改进 的中值滤波算法 , 法能够有效 地滤除数字 该算 图像 中的高密度椒盐 噪声 , 时尽 可能地保 留图像细节 , 同 具
有很强 的适用性 。
素及其邻域像素都被 判断为椒 盐噪声点 , 而这些像素全是事
组数 x , . x , 。x … , 中值 Y 定义为 :
Y Mi( , : + :e , … d ) f” 。 L (
¨ / ( 为偶数) )2 n
别 函数如下 :
其中 , ,x … x x ,’ 是 x ,2 . 按 照数值 的升序顺 序 x… ,
椒盐噪声,中值滤波
%%%%%%%%%%%%%% 添加椒盐噪声,使用中值滤波器%%%%%%%%%%%%%% 以相同概率取得图像的最大值和最小值[filename pathname]=uigetfile;img=imread(strcat(pathname,filename));%保留一份数据imgSave=img;[m,n,k]=size(img);figure(1);subplot(221);imshow(img);%find the maxium and minium of the bmpmaxium=10;minium=200;for i=1:mfor j=1:nif(img(i,j,1)>maxium)maxium=img(i,j,1);end;if(img(i,j,1)<minium)minium=img(i,j,1);end;end;end;%加入椒盐噪声的比率ratio=0.01;noisenum=ratio*(m*n);for num=1:noisenumt=mod(round(abs(rand())*3),3)+1;i=max(mod(round(abs(rand())*m+1),m),1);j=max(mod(round(abs(rand())*n+1),n),1);img(i,j,t)=maxium;i=max(mod(round(abs(rand())*m+1),m),1);j=max(mod(round(abs(rand())*n+1),n),1);img(i,j,t)=minium;end;%img=imnoise(img,'salt & pepper');subplot(222);imshow(img);title('salt&pepper noise');%后面要进行多个模板滤波,保留一份数据noiseimgSave=img;%开始中值滤波3*3的模板mid=zeros(9,1);for t=1:kfor x=2:m-1for y=2:n-1temp=img(x-1:x+1,y-1:y+1,t);for i=1:3for j=1:3mid((i-1)*3+j)=temp(i,j);end;end;mid=sort(mid);midvalue=mid(5);img(x,y,t)=midvalue;end;end;end;subplot(223);imshow(img);title('3*3 midvalue filter');%7*7模板img=noiseimgSave;mid=zeros(49,1);temp=zeros(7,7);for t=1:kfor x=4:m-4for y=4:n-4temp=img(x-3:x+3,y-3:y+3,t);for i=1:7for j=1:7mid((i-1)*7+j)=temp(i,j);end;end;mid=sort(mid);midvalue=mid(25);img(x,y,t)=midvalue;end;end;end;subplot(224);imshow(img);title('7*7');。
一种有效去除椒盐噪声的开关中值滤波器
一种有效去除椒盐噪声的开关中值滤波器许光宇【期刊名称】《安徽理工大学学报(自然科学版)》【年(卷),期】2017(037)001【摘要】After analyzing several median-based methods for the removal of salt-and-pepper noise, an efficient switching median filter for the removal of salt and pepper noise is presented.The proposed filter first divides pixels into two categories: noise-free and possible "noise pixels" based on two extreme intensity values in an image.In the filtering stage, when a pixel is classified as noise-free it will be left unchanged.For a "noise pixel", it is subjected to the following two-step filtering scheme.In the first step, if the filtering window, obtained according to noise density, contains no noise-free pixel, then the median of the filtering window is used as the restored value of the current pixel.Such filtering can restore misadjusted pixels as many as possible.Otherwise, extremum-rejection filtering and recursive filtering are applied to the rest of "noise pixels" by using the fixed 3×3 filtering window, which is used for noise removal and preserving image details.Experimental results show the proposed filter outperforms those of the compared filters in terms of both quantitative evaluation and visual quality, meanwhile exhibiting good performance for different noise levels.%图像去噪追求的目的是既能去除图像中的噪声,同时又能较完整的保持图像的细节信息.在研究几种基于中值的椒盐噪声去除方法基础上,设计了一种有效去除图像椒盐噪声的开关中值滤波器.提出的算法首先利用图像灰度值的两个极值把像素点分为信号点和可能噪声点.在滤波阶段,对于信号点保持其灰度值不变,对于可能噪声点分两步进行处理:根据噪声密度决定滤波窗口尺寸并判断滤波窗口内是否包含信号点,如果无信号点则以窗口内像素的中值作为可能噪声点的恢复值,这一步可对误判噪声点进行纠正;而其余可能噪声点采用极值舍弃滤波和递归滤波估计其灰度值,滤波窗口尺寸固定为3×3,这一步用来去除噪声和保持图像细节.实验结果表明,本文算法在主客观方面都优于相比较的方法,且对不同水平的椒盐噪声都具有较好的去除性能.【总页数】7页(P33-39)【作者】许光宇【作者单位】安徽理工大学计算机科学与工程学院, 安徽淮南 232001【正文语种】中文【中图分类】TP391.41【相关文献】1.一种用于抑制椒盐噪声的多窗口中值滤波器 [J], 邢藏菊;曲延锋;徐健;王守觉2.一种有效去除椒盐噪声的滤波算法 [J], 武英3.基于自适应中值滤波器和TV修复的椒盐噪声去除 [J], 王超;叶中付4.一种去除椒盐噪声的自适应开关中值滤波算法 [J], 乔坤; 郭朝勇; 毛东5.一种去除椒盐噪声的自适应开关中值滤波算法 [J], 乔坤; 郭朝勇; 毛东因版权原因,仅展示原文概要,查看原文内容请购买。
opencv 中值滤波去除椒盐噪声代码
文章标题:深度探讨:opencv 中值滤波去除椒盐噪声的代码实现在计算机视觉和图像处理领域,椒盐噪声是一种常见的问题,它会使图像出现黑白颗粒点,降低了图像质量,同时也影响了后续的图像处理和分析。
为了解决这一问题,opencv 中值滤波成为了一种常用的去噪方法之一。
本文将就opencv 中值滤波去除椒盐噪声的代码实现进行深度探讨,从概念到实现进行全面评估,以助您更深入地理解这一关键技术。
1. 椒盐噪声的影响在介绍opencv 中值滤波的代码实现之前,首先要了解椒盐噪声对图像的影响。
椒盐噪声是一种随机出现在图像中的噪声,表现为图像中出现黑色或白色的噪点。
这些噪点会对图像的细节和清晰度造成破坏,严重影响图像的质量和后续处理。
去除椒盐噪声成为了图像预处理中的重要步骤。
2. opencv 中值滤波的原理了解了椒盐噪声的影响,接下来我们来深入了解opencv 中值滤波的原理。
中值滤波是一种非线性滤波方法,它的原理是将像素点邻域内的像素灰度值进行排序,然后取中值作为该像素点的灰度值,从而达到去除噪声的目的。
与其他线性滤波方法相比,中值滤波在去除椒盐噪声方面具有更好的效果,能够有效保留图像的细节和边缘信息。
3. opencv 中值滤波的代码实现有了对中值滤波原理的深入理解,接下来就是实际的代码实现。
在opencv中,可以使用`medianBlur`函数来实现中值滤波。
该函数的原型为:```cppvoid cv::medianBlur(InputArray src,OutputArray dst,int ksize)```- `src`参数为输入图像,可以是单通道或多通道的图像。
- `dst`参数为输出图像,与输入图像有相同的尺寸和通道数。
- `ksize`参数为滤波模板的尺寸,必须为大于1的奇数。
通常取3、5、7等。
下面是一个简单的示例代码:```cpp#include <opencv2/opencv.hpp>int main(){cv::Mat img = cv::imread("input.jpg");cv::Mat dst;cv::medianBlur(img, dst, 5);cv::imshow("Original Image", img);cv::imshow("Filtered Image", dst);cv::waitKey(0);return 0;}```通过上述示例代码,我们可以轻松地实现对图像的中值滤波去除椒盐噪声。
椒盐噪声参数
椒盐噪声参数椒盐噪声参数椒盐噪声是一种常见的图像噪声,它会在图像中引入黑白点,影响图像的质量和可读性。
为了更好地理解和处理椒盐噪声,需要了解其相关参数。
一、什么是椒盐噪声椒盐噪声是一种随机出现的图像噪声,它会在图像中引入黑白点,使得图像变得模糊不清。
这种噪声通常由于数字相机或传感器故障、传输错误或存储设备损坏等原因引起。
二、椒盐噪声的特征1. 随机性:椒盐噪声是一种随机分布的噪声,其出现位置和数量都是不确定的。
2. 稀疏性:椒盐噪声通常只会在图像中出现少量黑白点,但这些点可能会严重影响图像质量。
3. 影响范围:椒盐噪声可以出现在整个图像区域内,但通常只会在局部区域内产生。
三、如何衡量椒盐噪声为了衡量和处理椒盐噪声,需要了解以下参数:1. 噪声密度:噪声密度是指图像中椒盐噪声点的数量与图像总像素数的比例。
通常使用百分比表示,如1%、5%等。
2. 均值滤波器尺寸:均值滤波器尺寸是指用于去除椒盐噪声的均值滤波器的大小。
通常使用奇数大小的方形滤波器,如3x3、5x5等。
3. 中值滤波器尺寸:中值滤波器尺寸是指用于去除椒盐噪声的中值滤波器的大小。
通常使用奇数大小的方形滤波器,如3x3、5x5等。
4. 最小像素阈值:最小像素阈值是指图像中被认为是椒盐噪声点的最小亮度或灰度级别。
通常设置为0或1。
四、如何处理椒盐噪声为了去除椒盐噪声并恢复图像质量,可以采用以下方法:1. 均值滤波:使用均值滤波器对图像进行平滑处理,以去除椒盐噪声。
但该方法可能会导致图像模糊。
2. 中值滤波:使用中值滤波器对图像进行平滑处理,以去除椒盐噪声。
该方法可以有效去除椒盐噪声,同时保留图像细节。
3. 信号处理算法:使用信号处理算法对图像进行去噪处理,如小波变换、快速傅里叶变换等。
4. 深度学习方法:使用深度学习方法对图像进行去噪处理,如卷积神经网络、自编码器等。
五、总结椒盐噪声是一种常见的图像噪声,它会在图像中引入黑白点,影响图像的质量和可读性。
图像去噪技术中的常见噪声类型及滤波方法
图像去噪技术中的常见噪声类型及滤波方法在图像处理领域,图像去噪技术是一项非常重要的任务。
噪声通常由于图像获取或传输过程中的干扰引起,对图像质量产生不良影响。
因此,了解常见噪声类型及相应的滤波方法对于成功去除噪声、提升图像质量至关重要。
以下是图像去噪技术中常见的几种噪声类型及相应的滤波方法:1. 高斯噪声:高斯噪声是图像处理中最常见的噪声类型之一,它具有均值为零、方差相同的正态分布特征。
为去除高斯噪声,可以使用高斯滤波器。
高斯滤波器通过使用与噪声具有相似尺度的卷积核来平滑图像。
它能够有效地减少高频噪声,但也可能损失一些图像细节。
2. 盐噪声和胡椒噪声:盐噪声和胡椒噪声是由于图像传感器或信号传输引起的随机亮度突然变化。
盐噪声导致图像中的亮点,而胡椒噪声则导致暗点。
为去除这种噪声,可以使用中值滤波器。
中值滤波器通过将像素周围的一组像素排序,并将中间值作为输出来减少这种噪声。
中值滤波器能够有效地去除椒盐噪声,但可能导致图像细节的模糊。
3. 椒盐噪声:椒盐噪声包括随机出现的黑白像素点,类似盐和胡椒一样。
为去除椒盐噪声,可以使用自适应中值滤波器。
自适应中值滤波器通过根据像素周围邻域的灰度级变化来选择适当的中值滤波器大小。
它可以根据像素周围的情况自动调整滤波器的尺寸,在保留图像细节的同时减少椒盐噪声的影响。
4. 橡皮泥噪声:橡皮泥噪声是一种低频噪声,通常由于传输或存储图像时的压缩引起。
为去除橡皮泥噪声,可以使用自适应均值滤波器。
自适应均值滤波器通过计算像素周围邻域的均值并用其代替当前像素值来减少噪声。
它能够有效地消除橡皮泥噪声,但可能导致图像细节的平滑化。
除了上述常见的噪声类型和滤波方法外,还有其他一些噪声类型和相应的去噪方法,如波动噪声、条纹噪声等。
对于不同的噪声类型,选择适当的滤波方法是至关重要的,以实现最佳的去噪效果。
然而,需要注意的是,图像去噪技术并不是完美的,因为过度去噪可能会损坏图像的细节和边缘信息。
中值滤波与椒盐噪声
中值滤波与椒盐噪声
椒盐噪声:也称为脉冲噪声:
在图像中,它是⼀种随机出现的⽩点或者⿊点,可能是亮的区域有⿊⾊像素或是在暗的区域有⽩⾊像素(或是两者皆有)。
在⼀维信号中,可以理解为⼀些离群的点或者尖脉冲。
举两个栗⼦:分别为带有椒盐噪声⼆维信号和⼀维信号
滤除椒盐噪声⽐较有效的⽅法是对信号进⾏中值滤波处理。
顾名思义,中值滤波是指将⼀个像素的值⽤该像素邻域中强度值的中间值来取代,⾄于领域范围取多⼤则视实际需要⽽定。
去除椒盐噪声的后可以得到较为平滑的信号,其效果要优于均值滤波器,当然同样也会造成边缘模糊、信号不够锐利,这似乎也是很多滤波⽅法的⼀⼤通病。
下⾯给出⼆维信号以及⼀维信号在中值滤波前后的⼀个对⽐效果:
matlab中,调⽤ y = medfilt1(x,n)即可进⾏⼀维信号的中值滤波操作(x表⽰输⼊信号,n值窗宽度)调⽤B = medfilt2(A, [m n])可完成⼆维信号的中值滤波操作(A为输⼊矩阵,采⽤m*n⼤⼩的窗⼝)。
Python实现中值滤波去噪方式
Python实现中值滤波去噪⽅式中值滤波器去噪:中值滤波的主要原理是将数字图像中的某点⽤该点的邻域中各个像素值的中值所来代替,这样就能让⽬标像素周围能够更好的接近真实值,⽐如⼀张⽩纸上有⼀个⿊点时,⿊点的像素值⽐较⼤,经过中值滤波过后,⿊点附近的像素值可能就会变⼩。
经过中值滤波后⼀些相对孤⽴的噪声点就容易被清除掉,这样就能提⾼图像的质量。
所以中值滤波器去噪的⼀个优点就是对椒盐噪声的去除具有很好的效果,具体操作是选取⼀个中⼼邻域,然后给邻域类各个像素的灰度值按⼤⼩进⾏排序,选取排序序列中的中值作为该邻域中⼼点的像素值的灰度值。
它的缺点是当邻域挑选过⼤时,可能会造成图像特征丢失。
实现代码如下:import numpy as npimport cv2from PIL import Imageimport scipy.signal as signalimport matplotlib.pyplot as plt#创建⼀个500*500的矩阵input_images = np.zeros((500, 500))filename = "E:/pycharm/GraduationDesign/Test/testtwo.png"#convert将当前图像转换为灰度模式,并且返回新的图像。
#将图⽚在重新定义的矩阵中再显⽰,不然可能会只显⽰部分。
img = Image.open(filename).resize((500, 500)).convert('L')plt.subplot(221)plt.title('原图', fontproperties=font_set)plt.imshow(img)#图像的尺⼨,按照像素数计算。
它的返回值为宽度和⾼度的⼆元组(width, height)。
width = img.size[0]height = img.size[1]threshold=130#可以改写代码使其成为⼆值化,此代码可理解为反向⼆值化for h in range(height):for w in range(width):#getpixel直接获得(h,w)处的像素直接返回这个点三个通道的像素值#返回给定位置的像素值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目四:中值滤波器设计及椒盐噪声滤除一、实验背景在数字图像的生成与采集过程中,由于受工作环境,器件等性能的影响,使得一幅未经处理的原始图像,都存在着一定的噪声干扰。
这种噪声具有以下性质:1、图像上的噪声出现处呈现不规则分布;2、噪声的大小也是不规则的。
这些噪声恶化了图像质量,使图像模糊甚至淹没目标特征,给后续的处理分析带来了困难。
因此需要对图像应该进行滤除噪声处理。
二、 实验目的1. 通过利用c 程序实现数字信号处理的相关功能,巩固对信号处理原理知识的理解,培养快速解决实际问题的能力提高实际编程和处理数据的综合能力,初步培养在解决信号处理实际应用问题中所应具备的基本素质和要求。
2. 培养独立思考的能力与研发能力,通过设计实现不同的信号处理问题,初步掌握在给定条件和功能的情况下,实现合理设计算法结构的能力。
3. 提高资料查询和整理的能力。
能够在短时间内找到适合自己的方法。
并在文献整理的过程中学会科技文献的写作,提高语言表达能力。
三、 实验内容1. 理解什么是椒盐噪声,中值滤波的原理及其特性。
2. 设计一种中值滤波,对椒噪声滤波有效,并分析滤波器的适用范围。
3、(扩展训练)对设计的滤波器针对椒、盐噪声滤除分别进行测试,并进行性能比较分析,并讨论椒、盐噪声频度(噪声数目占图像实际像素的百分比)对滤波器实际效果的影响。
四、实验原理1.椒盐噪声椒盐噪声又称脉冲噪声,是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。
椒盐噪声往往由图像切割引起。
椒盐噪声的PDF 是:如果b>a ,灰度值b 在图像中将显示为一个亮点,a 的值将显示为一个暗点。
若或 为零,则脉冲噪声称为单级脉冲。
如果 和 均不为零,尤其是他们近似相等时,脉冲噪声值将类似于随机分布在图像上的胡椒和盐粉微粒。
()⎪⎩⎪⎨⎧===其他0b z P a z P z p b aa Pb P a P b P形象的说,椒噪声在图像上是类似于黑胡椒颗粒的小点,而盐噪声在图像上是类似于白色盐粒的小点。
2、 平滑化去噪声思想如何从一副有噪声的图像中把噪声去除呢?此时,因有随机噪声而把像素的真值隐藏起来,而不被知晓,可表现为图像变暗而不清楚。
我们的目的是要把干扰的噪声除去,得到视觉清晰的图像。
如右图,噪声的浓度与其周围像素的浓度间,存在着很大的浓度差,使人觉得很刺眼, 利用噪声的这种性质除去噪声的方法,一般称为平滑化(smoothing )。
3、中值滤波的原理及特性:中值滤波在图像处理中,常用于用来保护边缘信息,是一种经典的平滑噪声的方法。
(1)中值滤波原理中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个拎域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。
方法是去某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。
二维中值滤波输出为g (x,y )=med{f(x-k,y-l),(k,l ∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。
W 为二维模板,通常为2*2,3*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。
(2)中值滤波器:中值滤波器:用该像素相邻像素的灰度中值来代替该像素的值 :实现方法:a. 通过从图像中的某个采样窗口取出奇数个数据进行排序,位于采样窗中间的中值作为输出;b. 丢弃最早的值,用排序后的中值取代要处理的数据即可。
(3)中值滤波特性)},({),(ˆ),(t s g median y x fxyS t s ∈=中值滤波是图像处理中的一个常用步骤,它对于斑点噪声和椒盐噪声来说尤其有用。
中值滤波方法以牺牲图像清晰度为代价消除图像中的椒盐噪声。
中值滤波不能保证把噪声去除,只能在有限的范围内减弱噪声对图像的影响。
同时,中值滤波不能多次使用,因为这样会使图像各个像素间趋于相同,整个图像就会变得越来越模糊。
另外,通过查阅资料发现,中值滤波器的效果不仅仅和观察窗的大小有关,还和观察窗的形状有关。
五、实验步骤1、根据题目要求,先画出程序的流程图。
结束结束2、源程序:(1)基础训练部分:#include <windows.h>#include <stdio.h>unsigned char*pBmpBuf=NULL;//读入图像数据的指针unsigned char*pBmpBuf2=NULL;//读入图像数据的指针int bmpWidth; //图像宽度int bmpHeight; //图像高度RGBQUAD *pColorTable;//颜色表指针int biBitCount; //图像类型,每像素的位数//读程序可读取8,24位图,本实验是对8位灰度图进行操作,满足要求bool readBmp(char *bmpName,int ImageWidth,int ImageHeight){int i,j; //行列数BYTE **B; //分别对应图像的RGB,本实验中RGB相等,故意义不大BYTE **R;BYTE **G;FILE *fp=fopen(bmpName,"rb"); //打开文件if(fp==0) return 0;fseek(fp,sizeof(BITMAPFILEHEADER),0); //找出头文件BITMAPINFOHEADER head;fread(&head,sizeof(BITMAPINFOHEADER),1,fp);ImageWidth=head.biWidth; //图像宽度赋值ImageHeight=head.biHeight; //图像高度赋值bmpWidth=ImageWidth;bmpHeight=ImageHeight;biBitCount=head.biBitCount;int lineByte=(bmpWidth*biBitCount/8+3)/4*4; //一行中信息点字节if (biBitCount==8){pColorTable=new RGBQUAD[256];fread(pColorTable,sizeof(RGBQUAD),256,fp);}pBmpBuf=new unsigned char[lineByte*bmpHeight];fread(pBmpBuf,1,lineByte*bmpHeight,fp);//开空间B=NULL;B=(BYTE**)malloc(sizeof(BYTE*)*bmpHeight);for(i=0; i<bmpHeight; i++)B[i] = (BYTE*)malloc(sizeof(BYTE)*bmpWidth);if(B==NULL){printf("fail to malloc B\n");exit(0);}G=NULL;G=(BYTE**)malloc(sizeof(BYTE*)*bmpHeight);for(i=0; i<bmpHeight; i++)G[i] = (BYTE*)malloc(sizeof(BYTE)*bmpWidth);if(G==NULL){printf("fail to malloc G\n");exit(0);}R=NULL;R=(BYTE**)malloc(sizeof(BYTE*)*bmpHeight);for(i=0; i<bmpHeight; i++)R[i] = (BYTE*)malloc(sizeof(BYTE)*bmpWidth);if(R==NULL){printf("fail to malloc R\n");exit(0);}//读图像的RGBif (biBitCount==8){for(i=0;i<bmpHeight/50;i++){for(j=0;j<bmpWidth/50;j++){B[i][j]=*(pBmpBuf+i*lineByte+j);G[i][j]=*(pBmpBuf+i*lineByte+j);R[i][j]=*(pBmpBuf+i*lineByte+j);printf("(B=%d,G=%d,R=%d)\n",B[i][j],G[i][j],R[i][j]);}}}else if (biBitCount==24){for(i=0;i<bmpHeight/100;i++){for(j=0;j<bmpWidth/100;j++){B[i][j]=*(pBmpBuf+i*lineByte+j*3+0);G[i][j]=*(pBmpBuf+i*lineByte+j*3+1);R[i][j]=*(pBmpBuf+i*lineByte+j*3+2);printf("(B=%d,G=%d,R=%d)\n",B[i][j],G[i][j],R[i][j]);}}}fclose(fp);//释放空间for(i=0; i<bmpHeight; ++i)free(B[i]);free(B);B=NULL;for(i=0; i<bmpHeight; ++i)free(G[i]);free(G);G=NULL;for(i=0; i<bmpHeight; ++i)free(R[i]);free(R);R=NULL;return 1;}bool writeBmp(char *bmpName, int ImageWidth,int ImageHeight){unsigned char *imgBuf=pBmpBuf2;if(!imgBuf)return 0;int colorTablesize=0;if(biBitCount==8)colorTablesize=1024;int lineByte=(ImageWidth*biBitCount/8+3)/4*4;FILE *fp=fopen(bmpName,"wb");if (fp==0) return 0;BITMAPFILEHEADER fileHead;fileHead.bfType=0x4D42;fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTab lesize+lineByte*ImageHeight;fileHead.bfReserved1=0;fileHead.bfReserved2=0;fileHead.bfOffBits=54+colorTablesize;fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);BITMAPINFOHEADER head;head.biBitCount=biBitCount;head.biClrImportant=0;head.biClrUsed=0;head.biCompression=0;head.biHeight=ImageHeight;head.biPlanes=1;head.biSize=40;head.biSizeImage=lineByte*ImageHeight;head.biWidth=ImageWidth;head.biXPelsPerMeter=0;head.biYPelsPerMeter=0;fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);if (biBitCount==8)fwrite(pColorTable,sizeof(RGBQUAD),256,fp);fwrite(imgBuf,ImageHeight*lineByte,1,fp);fclose(fp);return 1;}void Med(){int i,j,a,b;BYTE p[9],s;int lineByte=(bmpWidth +3)/4*4; //计算一行中储存信息的字节数pBmpBuf2=new unsigned char[lineByte*bmpHeight];memcpy(pBmpBuf2,pBmpBuf,lineByte*bmpHeight); //将原图复制//观察窗取3*3的矩形窗for(i=1;i<bmpHeight-2;i++) //边缘不进行处理{for(j=3;j<bmpWidth*3-3;j=j+3) //每一个像素点由RGB三个字节组成,故一个单元为三字节,相对应改变就需要将列数值j设为每三字节取一次//取原图像中该点周围的一个矩形部分{p[0]=*(pBmpBuf+(i-1)*lineByte+j-3);p[1]=*(pBmpBuf+(i-1)*lineByte+j);p[2]=*(pBmpBuf+(i-1)*lineByte+j+3);p[3]=*(pBmpBuf+i*lineByte+j-3);p[4]=*(pBmpBuf+i*lineByte+j);p[5]=*(pBmpBuf+i*lineByte+j+3);p[6]=*(pBmpBuf+(i+1)*lineByte+j-3);p[7]=*(pBmpBuf+(i+1)*lineByte+j);p[8]=*(pBmpBuf+(i+1)*lineByte+j+3);//排序for(a=0;a<5;a++){for(b=a+1;b<9;b++){if (p[a]>p[b]){s=p[a];p[a]=p[b];p[b]=s;}}}*(pBmpBuf2+i*lineByte+j)=p[4]; //取中值}}}void main(){char readPath[]="输入图像.bmp";readBmp(readPath,bmpWidth,bmpHeight);printf("width=%d,height=%d,biBitCount=%d\n",bmpWidth,bmpHeight,biBitCount) ;Med();char writePath[]="输出图像.bmp";writeBmp(writePath,bmpWidth,bmpHeight);delete []pBmpBuf;delete []pBmpBuf2;if(biBitCount==8)delete[] pColorTable;}(2)扩展训练部分#include <windows.h>#include <stdio.h>unsigned char*pBmpBuf=NULL;//读入图像数据的指针unsigned char*pBmpBuf2=NULL;//读入图像数据的指针2unsigned char*pBmpBuf3=NULL;//读入图像数据的指针3int bmpWidth;int bmpHeight;RGBQUAD *pColorTable;//颜色表指针int biBitCount; //图像类型,每像素的位数bool readBmp(char *bmpName,int ImageWidth,int ImageHeight){int i,j;BYTE **B;BYTE **R;BYTE **G;FILE *fp=fopen(bmpName,"rb");if(fp==0) return 0;fseek(fp,sizeof(BITMAPFILEHEADER),0);BITMAPINFOHEADER head;fread(&head,sizeof(BITMAPINFOHEADER),1,fp);ImageWidth=head.biWidth;ImageHeight=head.biHeight;bmpWidth=ImageWidth;bmpHeight=ImageHeight;biBitCount=head.biBitCount;int lineByte=(bmpWidth*biBitCount/8+3)/4*4;if (biBitCount==8){pColorTable=new RGBQUAD[256];fread(pColorTable,sizeof(RGBQUAD),256,fp);}pBmpBuf=new unsigned char[lineByte*bmpHeight];fread(pBmpBuf,1,lineByte*bmpHeight,fp);//开空间B=NULL;B=(BYTE**)malloc(sizeof(BYTE*)*bmpHeight);for(i=0; i<bmpHeight; i++)B[i] = (BYTE*)malloc(sizeof(BYTE)*bmpWidth);if(B==NULL){printf("fail to malloc B\n");exit(0);}G=NULL;G=(BYTE**)malloc(sizeof(BYTE*)*bmpHeight);for(i=0; i<bmpHeight; i++)G[i] = (BYTE*)malloc(sizeof(BYTE)*bmpWidth);if(G==NULL){printf("fail to malloc G\n");exit(0);}R=NULL;R=(BYTE**)malloc(sizeof(BYTE*)*bmpHeight);for(i=0; i<bmpHeight; i++)R[i] = (BYTE*)malloc(sizeof(BYTE)*bmpWidth);if(R==NULL){printf("fail to malloc R\n");exit(0);}//读图像的RGBif (biBitCount==8){for(i=0;i<bmpHeight/50;i++){for(j=0;j<bmpWidth/50;j++){//printf("(B=%d,G=%d,R=%d)\n",*(pBmpBuf+i*lineByte+j),*(pBmpBuf+i*lineByte +j),*(pBmpBuf+i*lineByte+j));B[i][j]=*(pBmpBuf+i*lineByte+j);G[i][j]=*(pBmpBuf+i*lineByte+j);R[i][j]=*(pBmpBuf+i*lineByte+j);printf("(B=%d,G=%d,R=%d)\n",B[i][j],G[i][j],R[i][j]);}}}else if (biBitCount==24){for(i=0;i<bmpHeight/100;i++){for(j=0;j<bmpWidth/100;j++){//printf("(B=%d,G=%d,R=%d)\n",*(pBmpBuf+i*lineByte+j*3+0),*(pBmpBuf+i*line Byte+j*3+1),*(pBmpBuf+i*lineByte+j*3+2));B[i][j]=*(pBmpBuf+i*lineByte+j*3+0);G[i][j]=*(pBmpBuf+i*lineByte+j*3+1);R[i][j]=*(pBmpBuf+i*lineByte+j*3+2);printf("(B=%d,G=%d,R=%d)\n",B[i][j],G[i][j],R[i][j]);}}}fclose(fp);//释放空间for(i=0; i<bmpHeight; ++i)free(B[i]);free(B);B=NULL;for(i=0; i<bmpHeight; ++i)free(G[i]);free(G);G=NULL;for(i=0; i<bmpHeight; ++i)free(R[i]);free(R);R=NULL;return 1;}bool writeBmp(char *bmpName, int ImageWidth,int ImageHeight){unsigned char *imgBuf=pBmpBuf2;if(!imgBuf)return 0;int colorTablesize=0;if(biBitCount==8)colorTablesize=1024;int lineByte=(ImageWidth*biBitCount/8+3)/4*4;FILE *fp=fopen(bmpName,"wb");if (fp==0) return 0;BITMAPFILEHEADER fileHead;fileHead.bfType=0x4D42;fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTab lesize+lineByte*ImageHeight;fileHead.bfReserved1=0;fileHead.bfReserved2=0;fileHead.bfOffBits=54+colorTablesize;fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);BITMAPINFOHEADER head;head.biBitCount=biBitCount;head.biClrImportant=0;head.biClrUsed=0;head.biCompression=0;head.biHeight=ImageHeight;head.biPlanes=1;head.biSizeImage=lineByte*ImageHeight;head.biWidth=ImageWidth;head.biXPelsPerMeter=0;head.biYPelsPerMeter=0;fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);if (biBitCount==8)fwrite(pColorTable,sizeof(RGBQUAD),256,fp);fwrite(imgBuf,ImageHeight*lineByte,1,fp);fclose(fp);return 1;}bool writeBmp2(char *bmpName, int ImageWidth,int ImageHeight){unsigned char *imgBuf=pBmpBuf3;if(!imgBuf)return 0;int colorTablesize=0;if(biBitCount==8)colorTablesize=1024;int lineByte=(ImageWidth*biBitCount/8+3)/4*4;FILE *fp=fopen(bmpName,"wb");if (fp==0) return 0;BITMAPFILEHEADER fileHead;fileHead.bfType=0x4D42;fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTab lesize+lineByte*ImageHeight;fileHead.bfReserved1=0;fileHead.bfReserved2=0;fileHead.bfOffBits=54+colorTablesize;fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);BITMAPINFOHEADER head;head.biBitCount=biBitCount;head.biClrImportant=0;head.biClrUsed=0;head.biCompression=0;head.biHeight=ImageHeight;head.biPlanes=1;head.biSize=40;head.biSizeImage=lineByte*ImageHeight;head.biWidth=ImageWidth;head.biXPelsPerMeter=0;head.biYPelsPerMeter=0;fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);if (biBitCount==8)fwrite(imgBuf,ImageHeight*lineByte,1,fp);fclose(fp);return 1;}void Med(){int i,j,x,y;BYTE p[5],s;int lineByte=(bmpWidth+3)/4*4;pBmpBuf2= new unsigned char[lineByte*bmpHeight];memcpy(pBmpBuf2,pBmpBuf,lineByte*bmpHeight);for(i=1;i<bmpHeight-2;i++){for(j=3;j<bmpWidth*3-3;j=j+3){p[0]=*(pBmpBuf+(i-1)*lineByte+j);p[1]=*(pBmpBuf+i*lineByte+j-3);p[2]=*(pBmpBuf+i*lineByte+j);p[3]=*(pBmpBuf+i*lineByte+j+3);p[4]=*(pBmpBuf+(i+1)*lineByte+j);for(x=0;x<3;x++){for(y=x+1;y<5;y++){if (p[y]>p[x]){s=p[y];p[y]=p[x];p[x]=s;}}}*(pBmpBuf2+i*lineByte+j)=p[2];}}//左下角为黑色/* int i,j;int lineByte=(bmpWidth*biBitCount/8+3)/4*4;for(i=0;i<bmpHeight/2;i++){for(j=0;j<bmpWidth/2;j++){*(pBmpBuf+i*lineByte+j)=0;}// int x,y;// BYTE p[9],s;// BYTE *lpTemp=new BYTE[bmpWidth*bmpHeight]; 中值滤波// int i,j;/* for(y=1;y<bmpHeight-1;y++){for(x=3;x<bmpWidth*3-3;x++){p[0]=lpBits[x-3+(y-1)*bmpWidth];p[1]=lpBits[x+(y-1)*bmpWidth];p[2]=lpBits[x+3+(y-1)*bmpWidth];p[3]=lpBits[x-3+y*bmpWidth];p[4]=lpBits[x+y*bmpWidth];p[5]=lpBits[x+3+y*bmpWidth];p[6]=lpBits[x-3+(y+1)*bmpWidth];p[7]=lpBits[x+(y+1)*bmpWidth];p[8]=lpBits[x+3+(y+1)*bmpWidth];for(j=0;j<5;j++){for(i=j+1;i<9;i++){if (p[j]>p[i]){s=p[j];p[j]=p[i];p[i]=s;}}}lpTemp[x+y*bmpWidth]=p[4];}}lpBits=lpTemp;*/}void Med2(){int i,j,x,y;BYTE p[9],s;int lineByte=(bmpWidth+3)/4*4;pBmpBuf3= new unsigned char[lineByte*bmpHeight];memcpy(pBmpBuf3,pBmpBuf,lineByte*bmpHeight);for(i=2;i<bmpHeight-2;i++){for(j=6;j<bmpWidth*3-6;j=j+3)p[0]=*(pBmpBuf+(i-2)*lineByte+j);p[1]=*(pBmpBuf+(i-1)*lineByte+j);p[2]=*(pBmpBuf+i*lineByte+j-6);p[3]=*(pBmpBuf+i*lineByte+j-3);p[4]=*(pBmpBuf+i*lineByte+j);p[5]=*(pBmpBuf+i*lineByte+j+3);p[6]=*(pBmpBuf+i*lineByte+j+6);p[7]=*(pBmpBuf+(i+1)*lineByte+j);p[8]=*(pBmpBuf+(i+2)*lineByte+j);for(x=0;x<5;x++){for(y=x+1;y<9;y++){if (p[y]>p[x]){s=p[y];p[y]=p[x];p[x]=s;}}}*(pBmpBuf3+i*lineByte+j)=p[4];}}}void main(){char readPath[]="输入图像.bmp";readBmp(readPath,bmpWidth,bmpHeight);printf("width=%d,height=%d,biBitCount=%d\n",bmpWidth,bmpHeight,biBitCount) ;Med();Med2();char writePath[]="输出图像1.bmp";writeBmp(writePath,bmpWidth,bmpHeight);char writePath2[]="输出图像2.bmp";writeBmp2(writePath2,bmpWidth,bmpHeight);delete []pBmpBuf;delete []pBmpBuf2;delete []pBmpBuf3;if(biBitCount==8)delete[] pColorTable;}六、实验效果及分析1、基础训练部分输入图像输出图像5次中值滤波后输出图像原图像根据实验结果可以看出,中值滤波法能将图片中的椒盐噪声很好地滤除掉,但与原图像清晰度为代价消除图像中的椒盐噪声。