精华内容
下载资源
问答
  • 中值滤波原理

    万次阅读 2017-08-10 10:47:13
    中值滤波和同态滤波都是图像增强的方法,但是这两种方法是从不同的方式进行改善一副图片的质量。 中值滤波是图像平滑的一种方法 它是一种非线性平滑滤波技术,在一定条件下可以克服线性滤波带来的图像细节的模糊...

    数字图像在其形成、传输记录的过程中往往会受到很多噪声的的污染,比如:椒盐噪声、高斯噪声等,为了抑制和消除这些随即产生的噪声而改善图像的质量,就需要去、对图像进行去噪处理,去噪也就是滤波处理。
    中值滤波和同态滤波都是图像增强的方法,但是这两种方法是从不同的方式进行改善一副图片的质量。
    中值滤波是图像平滑的一种方法 它是一种非线性平滑滤波技术,在一定条件下可以克服线性滤波带来的图像细节的模糊问题,特别是针对被椒盐噪声污染的图像。
    所谓中值滤波,其中滤波就是前面讲的去噪,关键在于中值两字,中值从字面意思上讲就是中间的那个值也就是中心值。

    举一个简单的例子:一维序列{0,3,4,0,7},进行中值滤波排序后为{0,0,3,4,7},则其中值为3

    数字图像是以二维图像来描述的,故对图像的滤波也就是对二维数据序列的滤波,这个二维序列相当于一个二维矩阵,里面元素的值就是每个像素点的像素。

    中值滤波通常采用一个含奇数个点的滑动窗口,用窗口的中的灰度值的中值来代替中心点的灰度值,其实就是对这个窗口中的灰度值进行排序,然后将其中值赋值给中心点即可。常用的中值滤波窗口形状有线状、方形、圆形以及十字形等。

    注:对每一个像素的m*n邻域进行计算,中值滤波对图像的边界用0做扩张,所以对边界可能会出现扭曲。 

    算法描述:

    [1] 获得源图像的首地址及图像的宽和高

    [2] 开辟一块内存缓冲区,用以暂存结果图像,并初始化为0

    [3] 逐个扫描图像中的像素点,将其邻域各元素的像素值从小到大进行排序,将求得到的中间值赋值给目标图像中与当前点对应的像素点

    [4] 循环步骤[3],直到处理完源图像的全部像素点

    [5] 将结果从内存缓冲区复制到源图像的数据区

    PS: 个人觉得中值滤波原理非常简单,在做的过程中原理没什么难度,一直让我纠结的是怎么去读取一副图片的数据区(也就是这副图片的像素值),对于我这个没接触过图像的水货来说困扰了我很久,当然利用matlab软件读取是很容易的事情,中值滤波也就其内嵌写好的函数调用就好了,但是为了锻炼一下自己,尝试用c写。

    Bmp图像的存储、格式以及读取

    现在讲解BMP4个组成部分:

    1.文件头信息块

    0000-0001:文件标识,为字母ASCII码“BM”。
    0002-0005:文件大小。
    0006-0009:保留,每字节以“00”填写。
    000A-000D:记录图像数据区的起始位置。各字节的信息依次含义为:文件头信息块大小,图像描述信息块的大小,图像颜色表的大小,保留(为01)。


    2.图像描述信息块

    000E-0011:图像描述信息块的大小,常为28H
    0012-0015:图像宽度。
    0016-0019:图像高度。
    001A-001B:图像的plane总数(恒为1)。
    001C-001D:记录像素的位数,很重要的数值,图像的颜色数由该值决定。
    001E-0021数据压缩方式(数值位0:不压缩;18位压缩;24位压缩)。
    0022-0025:图像区数据的大小。
    0026-0029:水平每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。
    002A-002D:垂直每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。
    002E-0031:此图像所用的颜色数,如值为0,表示所有颜色一样重要。

    3.颜色表

      颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像位64字节;256色图像为1024字节。其中,每4字节表示一种颜色,并以B(蓝色)、G(绿色)、R(红色)、alpha32位位图的透明度值,一般不需要)。即首先4字节表示颜色号1的颜色,接下来表示颜色号2的颜色,依此类推。

    4.图像数据区

      颜色表接下来位为位图文件的图像数据区,在此部分记录着每点像素对应的颜色号,其记录方式也随颜色模式而定,既2色图像每点占1位(8位为1字节);16色图像每点占4位(半字节);256色图像每点占8位(1字节);真彩色图像每点占24位(3字节)。所以,整个数据区的大小也会随之变化。究其规律而言,可的出如下计算公式:图像数据信息大小=(图像宽度*图像高度*记录像素的位数)/8
      然而,未压缩的图像信息区的大小。除了真彩色模式外,其余的均大于或等于数据信息的大小。这是为什么呢?原因有两个:
      1.BMP文件记录一行图像是以字节为单位的。因此,就不存在一个字节中的数据位信息表示的点在不同的两行中。也就是说,设显示模式位16色,在每个字节分配两个点信息时,如果图像的宽度位奇数,那么最后一个像素点的信息将独占一个字节,这个字节的后4位将没有意义。接下来的一个字节将开始记录下一行的信息。
      2.为了显示的方便,除了真彩色外,其他的每中颜色模式的行字节数要用数据“00”补齐为4的整数倍。如果显示模式为16色,当图像宽为19时,存储时每行则要补充4-(19/2+1)%4=2个字节(加1是因为里面有一个像素点要独占了一字节)。如果显示模式为256色,当图像宽为19时,每行也要补充4-19%4=1个字节。

    由于bmp图象是从下至上存储的,所以我们不能进行直接顺序读取。详细的说,bmp图象存储区数据是从1078偏移字节开始。文件内第一个图象点实际上是对应图象(320*200)第200行的最左边的第一个点,而从1078开始的320个点则是图象最下面一行对应的点,之后的321个点是图象倒数第二行最左边的第一个点。这样,bmp文件最后一个字节对应的点是第一行最后边的点了。

    BMP图像的读取

    文件格式

    典型的BMP图像文件由四部分组成。

    1>位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;

    2>位图信息数据结构,它包含有BMP图像的宽、高、压缩方法以及定义颜色等信息;

    3>调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;

    4>位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其它小于24位的使用调色板中颜色所引值。也就是说 1,4,8位图(2色图像为8字节;16色图像位64字节;256色图像为1024字节。)。

    位图的读取

    //读取文件头   

    fread(&bf,sizeof(bf),1,fi);  

    //读取文件信息头   

    fread(&bi,sizeof(bi),1,fi);  

          在默认字节对齐方式下,这样读取BMP图像会出现错误。由于系统默认情况下,结构体以4字节对齐,这样,对于结构体中不够4个字节的字段,会自动填充,使其也占据4个字节。对于像BMP图像这样采用1字节保存的文件,读取就会出错。

          对于这个问题,解决办法:

     I> 在读取之前使用

         #pragma pack(1)

         这条语句,将字节对齐方式设置为1字节对齐即可;

    这样即可

    如果以上的关于BMP的知识理解了,那么就不难实现中值滤波了。

    代码如下:

    [cpp] view plain copy
    1. /* 
    2.     filter.c 
    3. */  
    4. #include<stdio.h>  
    5. #include<stdlib.h>  
    6. #include <string.h>  
    7. typedef unsigned char BYTE;   
    8. //颜色表定义  
    9. typedef struct tagRGBQUAD {  
    10. BYTE rgbBlue;// 蓝色的亮度(值范围为0-255)  
    11. BYTE rgbGreen; // 绿色的亮度(值范围为0-255)  
    12. BYTE rgbRed; // 红色的亮度(值范围为0-255)  
    13. BYTE rgbReserved;// 保留,必须为0  
    14. } RGBQUAD;  
    15. /* 
    16.     定义头文件型 
    17. */  
    18. #pragma pack(1)//将字节对齐方式设置为1字节对齐  
    19. typedef struct  
    20. {  
    21. unsigned char id1;//位图文件的类型,必须为BM(占用0-1字节)   
    22. unsigned char id2;  
    23. unsigned int filesize;//位图文件的大小,以字节为单位(2-5字节)  
    24. unsigned int reserved;// 位图文件保留字,必须为0(6-9字节)  
    25. unsigned int bitmapdataoffset;//位图数据的起始位置,以相对于位图(10-13字节)  
    26. unsigned int bitmapheadersize;//BMP头的大小,固定为40(14-17字节)  
    27. unsigned int width;//图片宽度;以像素为单位(18-21字节)  
    28. unsigned int height;//图片高度;以像素为单位(22-25字节)  
    29. unsigned short planes;//图片位面数,必须为1(26-27字节)  
    30. unsigned short bitperpixel;//每个像素所需的位数,每个像素所需的位数(28-29字节)  
    31.    //只能是以下几个数:1(双色),4(16色),8(256色)或24(真彩色)  灰度级  
    32. unsigned int compression;//是否压缩(30-33字节)  
    33.  //只能是以下几个数:0(不压缩),1(BI_RLE8压缩类型),2(BI_RLE4压缩类型)  
    34. unsigned int bitmapdatasize;//位图的大小,以字节为单位(34-37字节)  
    35. unsigned int hresolution;//位图水平分辨率,每米像素数(38-41字节)  
    36. unsigned int vresolution;//位图垂直分辨率,每米像素数(42-45字节)  
    37. unsigned int colors;//位图实际使用的颜色表中的颜色数(46-49字节)  
    38. unsigned int importantcolors;//位图显示过程中重要的颜色数(50-53字节)  
    39. //unsigned int  bmiColors[1];//调色板;(54 - 57字节)  
    40. unsigned char palette[256][4];//调色板 占256*4=1024字节  
    41. }BMPheader;//总大小40+14+1024=1078字节  
    42. typedef struct  
    43. {  
    44. BMPheader* bmpheader ;  
    45. unsigned char* bitmapdata;//图片数据;  
    46. }BMPheaderfile;  
    47. /* 
    48.     求文件长度的函数 
    49. */  
    50. long getfilesize(FILE *f)  
    51. {  
    52. long pos,len;  
    53. pos=ftell(f);//ftell函数用于得到文件指针当前位置相对于文件首的偏移字节数  
    54. fseek(f,0,SEEK_END);//fseek函数用于移动文件指针相对于SEEK_END的偏移量为0  
    55. len=ftell(f);//len就是文件的长度  
    56. fseek(f,pos,SEEK_SET);//将文件指针移动到原来的地方  
    57. return len;  
    58. }  
    59. /* 
    60.     主函数 
    61. */  
    62. int main()  
    63. {  
    64. BMPheaderfile *output=(BMPheaderfile*)malloc(sizeof(BMPheaderfile));//定义一个输出指针  
    65. unsigned char *data=NULL;  
    66.     FILE *fpr,*fpw;  
    67. /* 
    68.   打开文件 
    69. */  
    70. if((fpr=fopen("start.bmp","rb"))==NULL)  
    71. {  
    72. printf("cannot open this file");  
    73. exit(0);  
    74. }  
    75. if((fpw=fopen("end1.bmp","wb"))==NULL)  
    76. {  
    77. printf("cannot wirte this file");  
    78. exit(0);  
    79. }  
    80. long length=getfilesize(fpr);  
    81. printf("文件的长度为%ld\n",length);  
    82. printf("文件的头长度为%d\n",sizeof(BMPheader));  
    83. data=(unsigned char*)malloc(length*sizeof(char));//分配空间  
    84. if(0==fread(data,1,length,fpr))//读文件,从fpr指向的文件中读出length到data所指的内存空间去  
    85. {  
    86. printf("read failed\n");  
    87. exit(0);  
    88. }  
    89. fclose(fpr);//释放指针  
    90. output->bmpheader=(BMPheader*)malloc(sizeof(BMPheader));  
    91. memcpy(output->bmpheader,data,sizeof(BMPheader));//从data中拷贝sizeof(BMPheader)大小到output->bmpheader  
    92.  /* 
    93.  打印出图像中头文件的信息 
    94.  */  
    95.     int height=output->bmpheader->height;  
    96. int width=output->bmpheader->width;  
    97. printf("filesize is %d\n",output->bmpheader->filesize);  
    98. printf("该图像每个像素所需要的位数:%d\n",output->bmpheader->bitperpixel);  
    99. printf("height is %d\n",output->bmpheader->height);  
    100. printf("width is %d\n",output->bmpheader->width);  
    101. data=data+sizeof(BMPheader);  
    102. output->bitmapdata=data;  
    103.   /* 
    104.    中值滤波算法(选择3×3的滑动窗口) 
    105.   */  
    106. unsigned char pixel[9]={0};//滑动窗口的像素值,初始为0  
    107. unsigned char mid;//中值  
    108. unsigned char temp;//中间变量  
    109. int flag;  
    110. int m,i,j,x,h,w,y;  
    111. for(j=1;j<height-1;j++)  
    112. {  
    113. for(i=1;i<width-1;i++)  
    114. {  
    115. //将3×3滑动窗口中的所有像素值放入pixel[m]  
    116. m=0;  
    117. for(y=j-1;y<=j+1;y++)  
    118. for(x=i-1;x<=i+1;x++)  
    119. {  
    120. pixel[m]=data[y*width+x];  
    121. m=m+1;  
    122. }  
    123. //让一位数组pixel[9]进行降序排列  
    124. do   
    125. {  
    126. flag=0;//循环结束的标志  
    127. for(m=0;m<9;m++)  
    128. {  
    129. if(pixel[m]<pixel[m+1])  
    130. {  
    131. temp=pixel[m];  
    132. pixel[m]=pixel[m+1];  
    133. pixel[m+1]=temp;  
    134. flag=1;  
    135. }//if  
    136. }//for  
    137. while (flag==1);  
    138. mid=pixel[4];  
    139. output->bitmapdata[width*j+i]=mid;  
    140. }  
    141. }  
    142. /* 
    143. N=5的中值滤波线段状 
    144. */  
    145. /* 
    146.     for(i=0;i<height;i++) 
    147. { 
    148. for(j=2;j<width-1;j++) 
    149. { 
    150. m=0; 
    151. for(x=j-2;x<=j+2;x++) 
    152. pixel[m++]=data[i*width+x]; 
    153. for(h=0;h<5;h++) 
    154. for(w=h+1;w<5;w++) 
    155. { 
    156. if(pixel[h]>pixel[w]) 
    157. { 
    158. temp=pixel[w]; 
    159. pixel[w]=pixel[h]; 
    160. pixel[h]=temp; 
    161. } 
    162. } 
    163. output->bitmapdata[i*width+j]=pixel[2]; 
    164. } 
    165. } 
    166. */  
    167. /* 
    168. 保存图像文件 
    169. */  
    170. fseek(fpw,0,0);  //fseek(fpw,0,SEEK_SET)  
    171. fwrite(output->bmpheader,1,sizeof(BMPheader),fpw);//写入图像的头文件  
    172. fwrite(output->bitmapdata,1,length-sizeof(BMPheader),fpw);//写入图像的数据信息  
    173. fclose(fpw);//释放指针  
    174. return 0;  
    175. }  

    运行结果(左边为源图像,右边为处理后的图像)
    图片图片
    最后,在和师兄交谈的时候,我又产生了疑问,为什么中值滤波可以起到去噪的效果,这还是要回到开始中值滤波的基本原理来说,当选定一个窗口,然后对其窗口中的像素值进行排序时,用其中值去代替中心值,这样就使每个像素值与周围(邻域)的像素值非常接近,这样就使去除那些孤立的噪点,达到了很好的去噪效果。
    0
    展开全文
  • 中值滤波原理及 MATLAB 实现 摘要图像是一种重要的信息源通过图像处理可以帮助人们了解信息的内涵 本文将纯净的图像加入椒盐噪声,然后采用中值滤波的方法对其进行去噪中值 滤波是一种常用的非线性信号处理技术在图像...
  • 中值滤波原理及MATLAB实现 摘要图像是一种重要的信息源通过图像处理可以帮助人们了解信息 的内涵本文将纯净的图像加入椒盐噪声,然后采用中值滤波的方法对 其进行去噪中值滤波是一种常用的非线性信号处理技术在图像...
  • 本文主要是对高斯滤波,中值滤波原理进行简单介绍,随后用代码实现高斯噪声和椒盐噪声。以及用高斯滤波和中值滤波对这两种图像进行相关的处理。 高斯噪声:就是服从高斯正态分布的噪声,通常是因为高温或者是传感器...

    本文主要是对高斯滤波,中值滤波原理进行简单介绍,随后用代码实现高斯噪声和椒盐噪声。以及用高斯滤波和中值滤波对这两种图像进行相关的处理。

    高斯噪声:就是服从高斯正态分布的噪声,通常是因为高温或者是传感器所引起的噪声,常识分布均匀的

     

    椒盐噪声:椒盐噪声又称脉冲噪声,它随机改变一些像素值,是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声

    对着两种噪声有降噪的方法如下

    中值滤波:抑制噪声保持细节,将窗口中奇数个数据按照大小顺序排列,处理中间的位置的那个数作为处理结果

    中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.
    中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。

    而本文在实现中值滤波的时候采取的是3*3的模板进行降噪,调用了numpy下面的meadian进行求取中值

    其算法的核心思想如下:

    import random
    import numpy as np
    import cv2
    
    #添加椒盐噪声
    def salt_and_peper_noise(img, porportion=0.05):
        noise_img=img
        height, width=noise_img.shape[0],noise_img.shape[1]#取得图像的高度img.shape[0];;img.shape[1]取
        # 得是图像的宽度,img.shape[2]取得是图像的通道数
        num=int(height*width*porportion)
        for i in range(num):
            #randint的作用是随机返回一个随机整数,范围从低到高,即[low,high)
            w=random.randint(0,width-1)
            h=random.randint(0,height-1)
            if random.randint(0,1)==0:
                noise_img[h,w]=0
            else:
                noise_img[h,w]=255
        return noise_img
    #中值滤波进行处理椒盐噪声
    #利用3*3的中值滤波器进行做处理
    def m_filter(img):
        H,W,C=img.shape
        K_size = 3
        ## Zero padding
        pad = K_size // 2
        out = np.zeros((H + pad * 2, W + pad * 2, C), dtype=np.float)
        out[pad:pad + H, pad:pad + W] = img.copy().astype(np.float)
    
        temp=out.copy()
        for x in range(H):
            for y in range(W):
                for c in range(C):
                    out[pad+x, pad+y,c]=np.median(temp[x:x+K_size, y:y+K_size, c])
        out=out[pad:pad+H, pad:pad+W].astype(np.uint8)
        return out
    
    
    if __name__ == '__main__':
        img = cv2.imread("C:/Users/JackXing/Pictures/zly.jpg")
        cv2.imshow("yuantu", img)
    
        #椒盐噪声与去除
        noise_img=salt_and_peper_noise(img)
        cv2.imshow("out",noise_img)
        new_img=median_filter(noise_img)(noise_img)
        cv2.imshow("junzhilvbo", new_img)

    所处理的图像结果如下图所示

     

    下一篇接着写高斯滤波器

    展开全文
  • 中值滤波原理??中值滤波本质上是一种统计排序滤波器。对于原图像中某点(i,j),中值滤波以该点为中心的邻域内的所有像素的统计排序中值作为(i,j)点的响应。??中值不同于均值,是指排序队列中位于中间位置的元素的值...

    中值滤波原理

    ??中值滤波本质上是一种统计排序滤波器。对于原图像中某点(i,j),中值滤波以该点为中心的邻域内的所有像素的统计排序中值作为(i,j)点的响应。

    ??中值不同于均值,是指排序队列中位于中间位置的元素的值,例如,采用3x3中值滤波器,某点(i,j)的8个邻域的一系列像素值为12,18,25,11、118,17、35,29,23,统计排序结果为11、12,17,18,23,25,29,35,118。排在中间位置(第5位)的23即作为(i,j)点中值滤波的响应g(i,j)。显然,中值滤波并非线性滤波器。

    原理图解:选定图像中的某个像素,采用3*3的滤波窗口进行滤波,将周围的8个像素连同选定的像素进行排序,然后选择排好序的中心像素值代替原来的像素值。即将图中的23代替原来的118。

    828e7404ab5461791597f8a88a2d12b5.png

    图中可以知道,当像素点太大或者太小时都不同意被选中,所以中值滤波对像素值比较大或者比较小的噪声滤除的效果比较好,如:椒盐噪声,对比较均匀的噪声滤除的效果一般,如:高斯噪声。

    中值滤波的优点:

    ??中值滤波对于某些类型的随机噪声具有非常理想的降噪能力,对于线性平滑滤波而言,在处理的像素邻域之内包含噪声点时,噪声的存在总会或多或少地影响该点的像素值的计算,(对于高斯平滑影响程度同噪声点到中心点的距离成正比),但在中值滤波中噪声点则常常是直接被忽略掉的;而且同线性平滑滤波器相比,中值滤波在降噪同时引起的模糊效应较低。

    使用MATLAB展示中值滤波效果:

    在matlab中中值滤波的函数是medfilt2函数,示例1,中值滤波对椒盐噪声和高斯噪声的滤波效果展示。

    1、采用的原图是:

    5017124b6864b3b0dab2d32681d45cde.png

    2、滤除椒盐噪声和高斯噪声的对比代码如下:

    %% 滤波效果展示

    clear; clc; close all;

    rawimg = imread(‘..picture1.jpg‘);

    [~,~,index] = size(rawimg);

    if index ~= 1

    rawimg = rgb2gray(rawimg); % 转化为灰度图

    end

    % 显示原图

    figure;imshow(rawimg);title(‘原图‘);

    % 添加噪声

    salt_img=imnoise(rawimg,‘salt & pepper‘,0.04); % 叠加密度为0.04的椒盐噪声

    guas_img = imnoise(rawimg,‘gaussian‘,0.04);

    figure;subplot(1,2,1);imshow(salt_img);title(‘添加椒盐噪声‘);

    subplot(1,2,2);imshow(guas_img);title(‘添加高斯噪声‘);

    % 进行滤波

    salt_fit = medfilt2(salt_img,[3 3]); % 采用二维中值滤波函数对图像滤波,滤波窗口是3*3

    guas_fit = medfilt2(guas_img,[3,3]); % 滤除高斯噪声

    % 滤波效果:

    figure;subplot(1,2,1);imshow(salt_fit);title(‘椒盐噪声滤波效果‘);

    subplot(1,2,2);imshow(guas_fit);title(‘高斯噪声滤波效果‘);

    添加噪声效果示例:

    200e53a0b3d04f0af4736281b6656e05.png

    使用中值滤波滤除的效果示例:

    dc9e6be7aa1115eac3fca61f008d9ec3.png

    分析:可以很明显的看到,中值滤波对椒盐噪声的滤除效果比高斯噪声要好,边缘部分的细节有部分的保留。

    3、选择不同的窗口对椒盐噪声的滤除效果对比示例代码:

    %% 滤波窗口选择展示

    clear; clc; close all;

    rawimg = imread(‘..picture1.jpg‘);

    [~,~,index] = size(rawimg);

    if index ~= 1

    rawimg = rgb2gray(rawimg); % 转化为灰度图

    end

    % 添加噪声

    salt_img=imnoise(rawimg,‘salt & pepper‘,0.04); % 叠加密度为0.04的椒盐噪声

    figure;subplot(1,2,1);imshow(rawimg);title(‘原图‘);

    subplot(1,2,2);imshow(salt_img);title(‘添加椒盐噪声‘);

    % 进行滤波

    min_fit = medfilt2(salt_img,[3 3]); % 采用二维中值滤波函数对图像滤波,滤波窗口是3*3

    max_fit = medfilt2(salt_img,[9,9]); % 滤除高斯噪声

    % 滤波效果:

    figure;subplot(1,2,1);imshow(min_fit);title(‘3*3滤波窗口效果‘);

    subplot(1,2,2);imshow(max_fit);title(‘9*9滤波窗口效果‘);

    添加椒盐噪声的效果示例:

    7ee2bc09df4c4b99b4d0d81f94bf2174.png

    分别选择[3,3]滤波窗口和[9,9]滤波窗口对噪声图像进行滤波效果对比示例:

    46df09b1b46beb47f94aece03ce11e73.png

    分析:可以很明显看到,当中值滤波的窗口选择越大的时候滤波的效果比较明显,但是窗口选择越大则对原图的边缘,细节部分滤除的部分就会越多,这个特性可以根据自己的需要进行调节。

    展开全文
  • matlab图像处理-中值滤波原理

    千次阅读 2020-05-16 16:18:04
    中值滤波原理   中值滤波本质上是一种统计排序滤波器。对于原图像中某点(i,j),中值滤波以该点为中心的邻域内的所有像素的统计排序中值作为(i,j)点的响应。   中值不同于均值,是指排序队列中位于中间位置...

    中值滤波原理

      中值滤波本质上是一种统计排序滤波器。对于原图像中某点(i,j),中值滤波以该点为中心的邻域内的所有像素的统计排序中值作为(i,j)点的响应。

      中值不同于均值,是指排序队列中位于中间位置的元素的值,例如,采用3x3中值滤波器,某点(i,j)的8个邻域的一系列像素值为12,18,25,11、118,17、35,29,23,统计排序结果为11、12,17,18,23,25,29,35,118。排在中间位置(第5位)的23即作为(i,j)点中值滤波的响应g(i,j)。显然,中值滤波并非线性滤波器。

    原理图解:选定图像中的某个像素,采用3*3的滤波窗口进行滤波,将周围的8个像素连同选定的像素进行排序,然后选择排好序的中心像素值代替原来的像素值。即将图中的23代替原来的118。

    在这里插入图片描述

    图中可以知道,当像素点太大或者太小时都不同意被选中,所以中值滤波对像素值比较大或者比较小的噪声滤除的效果比较好,如:椒盐噪声,对比较均匀的噪声滤除的效果一般,如:高斯噪声。

    中值滤波的优点:

      中值滤波对于某些类型的随机噪声具有非常理想的降噪能力,对于线性平滑滤波而言,在处理的像素邻域之内包含噪声点时,噪声的存在总会或多或少地影响该点的像素值的计算,(对于高斯平滑影响程度同噪声点到中心点的距离成正比),但在中值滤波中噪声点则常常是直接被忽略掉的;而且同线性平滑滤波器相比,中值滤波在降噪同时引起的模糊效应较低。

    使用MATLAB展示中值滤波效果:

    在matlab中中值滤波的函数是medfilt2函数,示例1,中值滤波对椒盐噪声和高斯噪声的滤波效果展示。

    1、采用的原图是:
    在这里插入图片描述

    2、滤除椒盐噪声和高斯噪声的对比代码如下:

    %% 滤波效果展示
    clear; clc; close all;
    rawimg = imread('..\picture\1.jpg');
    [~,~,index] = size(rawimg);
    if index ~= 1
       rawimg = rgb2gray(rawimg);  % 转化为灰度图 
    end
    % 显示原图
    figure;imshow(rawimg);title('原图');
    
    % 添加噪声
    salt_img=imnoise(rawimg,'salt & pepper',0.04);     % 叠加密度为0.04的椒盐噪声
    guas_img = imnoise(rawimg,'gaussian',0.04);
    figure;subplot(1,2,1);imshow(salt_img);title('添加椒盐噪声');
    subplot(1,2,2);imshow(guas_img);title('添加高斯噪声');
    
    % 进行滤波
    salt_fit = medfilt2(salt_img,[3 3]);   % 采用二维中值滤波函数对图像滤波,滤波窗口是3*3
    guas_fit = medfilt2(guas_img,[3,3]);  % 滤除高斯噪声
    
    % 滤波效果:
    figure;subplot(1,2,1);imshow(salt_fit);title('椒盐噪声滤波效果');
    subplot(1,2,2);imshow(guas_fit);title('高斯噪声滤波效果');
    

    添加噪声效果示例:

    在这里插入图片描述

    使用中值滤波滤除的效果示例:

    在这里插入图片描述

    分析:可以很明显的看到,中值滤波对椒盐噪声的滤除效果比高斯噪声要好,边缘部分的细节有部分的保留。

    3、选择不同的窗口对椒盐噪声的滤除效果对比示例代码:

    %% 滤波窗口选择展示
    clear; clc; close all;
    rawimg = imread('..\picture\1.jpg');
    [~,~,index] = size(rawimg);
    if index ~= 1
       rawimg = rgb2gray(rawimg);  % 转化为灰度图 
    end
    
    % 添加噪声
    salt_img=imnoise(rawimg,'salt & pepper',0.04);     % 叠加密度为0.04的椒盐噪声
    figure;subplot(1,2,1);imshow(rawimg);title('原图');
    subplot(1,2,2);imshow(salt_img);title('添加椒盐噪声');
    
    % 进行滤波
    min_fit = medfilt2(salt_img,[3 3]);   % 采用二维中值滤波函数对图像滤波,滤波窗口是3*3
    max_fit = medfilt2(salt_img,[9,9]);  % 滤除高斯噪声
    
    % 滤波效果:
    figure;subplot(1,2,1);imshow(min_fit);title('3*3滤波窗口效果');
    subplot(1,2,2);imshow(max_fit);title('9*9滤波窗口效果');
    

    添加椒盐噪声的效果示例:

    在这里插入图片描述

    分别选择[3,3]滤波窗口和[9,9]滤波窗口对噪声图像进行滤波效果对比示例:

    在这里插入图片描述

    分析:可以很明显看到,当中值滤波的窗口选择越大的时候滤波的效果比较明显,但是窗口选择越大则对原图的边缘,细节部分滤除的部分就会越多,这个特性可以根据自己的需要进行调节。

    展开全文
  • 对于数字图像的去噪,前边我们讲了均值滤波算法与高斯滤波算法,此外很常见的还有中值滤波算法,这些滤波算法都属于空间滤波,即对于每一个像素点,都选取其周围矩形区域中的像素点来计算滤波值。最近在项目中要使用...
  • 基于FPGA的图像中值滤波原理与实现

    千次阅读 2020-04-09 20:54:29
    图像中值滤波的FPGA实现项目简述中值滤波器原理中值滤波器的实现测试模块的代码仿真结果下板结果总结 项目简述 中值滤波器在去除尖端噪声中非常重要,是信号处理中最长用到的滤波器。图像中的一些椒盐噪声或者其它...
  • 中值滤波原理及MATLAB算法实现

    万次阅读 2017-04-11 18:00:50
    中值滤波是一种非线性滤波方式,它依靠模板来实现。 对于一维中值滤波,设模板的尺寸为 M ,M=2*r+1,r为模板半径,给定一维信号f(i),i = 1,2,3……N,则中值滤波输出为: g(i) = median[ f(j-r),f(j-r+1),...
  • 中值滤波原理及其C++实现与CUDA优化

    多人点赞 2021-01-05 21:41:32
    对于数字图像的去噪,前边我们讲了均值滤波算法与高斯滤波算法,此外很常见的还有中值滤波算法,这些滤波算法都属于空间滤波,即对于每一个像素点,都选取其周围矩形区域中的像素点来计算滤波值。最近...
  • 中值滤波原理及c++实现

    千次阅读 2019-03-24 18:06:15
    应用:中值滤波对脉冲噪声(如椒盐噪声)的抑制十分有用。 缺点:易造成图像的不连续性。 原理 原理很简单,如果一个信号是平缓变化的,那么某一点的输出值可以用这点的某个大小的邻域内的所有值的统计中值来代替...
  • 1.什么是中值滤波中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的...
  • 均值滤波或其他方式也可以使用,但就这个例子来说,中值滤波原理的效果会比较好一些。 中值滤波的原理,来自百度,比较容易理解:中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的...
  • matlab对中值滤波原理的编写,适合初学图像处理的同学
  • 均值滤波或其他方式也可以使用,但就这个例子来说,中值滤波原理的效果会比较好一些。 中值滤波的原理,来自百度,比较容易理解: 中值滤波 是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值...
  • 中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声...
  • 中值滤波_中值滤波

    2021-01-13 13:52:02
    中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声...
  • 均值滤波或其他方式也可以使用,但就这个例子来说,中值滤波原理的效果会比较好一些。 中值滤波的原理,来自百度,比较容易理解: 中值滤波 是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值...
  • 文章目录1 中值滤波1.1 原理1.2 中值滤波对图像的影响1.3 函数编写1.4 主文件1.5 效果展示2 高效的中值滤波算法2.1 原理2.2 函数编写3 带权重的中值滤波3.1 原理3.2 函数编写3.3 主文件3.4 效果展示 1 中值滤波 1.1 ...
  • 中值滤波概念: 中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,...
  • 前言在进行图像空域处理时,对于椒盐噪声的图像,中值滤波是一个很不错的选择,一般来说mask有矩形 椭形 和十字形,十字形被认为在处理含有少数尖锥基元的图像更能保证尖锥的形状,...中值滤波中值滤波原理很简...
  • 前言在进行图像空域处理时,对于椒盐噪声的图像,中值滤波是一个很不错的选择,一般来说mask有矩形 椭形 和十字形,十字形被认为在处理含有少数尖锥基元的图像更能保证尖锥的形状,...中值滤波中值滤波原理很简...
  • 原理中值滤波使用一个围绕当前像素的矩形,查找区域内像素的中值,并用该中值替换矩形区域内的其它像素点。 应用场合:中值滤波对于散射噪声的处理比较理想,因为散射噪声通常与周围像素值的差异非常大。但中值...
  • 中值滤波:设计中值滤波器,处理peppterN2.图像锐化:先将lana图像均值滤波(3*3,或5*5),作为原图像,设计锐化滤波器,处理。2.设计思路和流程图【正文用小五号,宋体字体】【不得改变格式】1.中值滤波:...
  • 开始之前 在上一篇我们实现了读取噪声图像, 然后 进行三种形式的均值滤波得到结果, 由于我们自己写的均值滤波未作边缘处理, 所以效果有一定的下降,...首先介绍了中值滤波原理, 给出其实现思路,并根据思路实现了 C+...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 523
精华内容 209
关键字:

中值滤波原理