图像处理滤波_图像处理滤波去噪 - CSDN
精华内容
参与话题
  • 转自:...目录 1 图像增强——图像平滑        1.1 图像增强简介        1.2 图像平滑 2 均值滤...

    转自:https://blog.csdn.net/zaishuiyifangxym/article/details/89788020
    目录

    2 均值滤波
    3 中值滤波
    4 高斯滤波


    1 图像增强——图像平滑

    1.1 图像增强简介
           图像增强是对图像进行处理,使其比原始图像更适合于特定的应用,它需要与实际应用相结合。对于图像的某些特征如边缘、轮廓、对比度等,图像增强是进行强调或锐化,以便于显示、观察或进一步分析与处理。图像增强主要是一个主观过程,而图像复原大部分是一个客观过程。图像增强的方法是因应用不同而不同的,研究内容包括:
    在这里插入图片描述
    1.2 图像平滑
           图像平滑是一种区域增强的算法,平滑算法有邻域平均法、中指滤波、边界保持类滤波等。在图像产生、传输和复制过程中,常常会因为多方面原因而被噪声干扰或出现数据丢失,降低了图像的质量(某一像素,如果它与周围像素点相比有明显的不同,则该点被噪声所感染)。这就需要对图像进行一定的增强处理以减小这些缺陷带来的影响。
           图像平滑 有均值滤波、方框滤波、中值滤波和高斯滤波等。下面将介绍常用的均值滤波、中值滤波和高斯滤波。
           为了实验方便,首先给图像加一点噪声.
    代码如下所示:

    	    # -*- coding:utf-8 -*-
    	    import cv2
    	    import numpy as np
         
    	    # 读取图片
    	    img = cv2.imread("zxp.jpg", cv2.IMREAD_UNCHANGED)
    	    img_noise=img
    	     
    	    cv2.imshow("src", img)
    	     
    	    rows, cols, chn = img_noise.shape
    	     
    	     
    	    # 加噪声
    	    for i in range(5000):
    	        x = np.random.randint(0, rows)
    	        y = np.random.randint(0, cols)
    	        img_noise[x, y, :] = 255
    	     
    	     
    	    cv2.imshow("noise", img_noise)
    	     
    	    # 等待显示
    	    cv2.waitKey(0)
    	    cv2.destroyAllWindows()
    	     
    	    #保存含噪声图像
    	    cv2.imwrite("zxp_noise.jpg", img_noise)
    

    运行结果如下图所示:
    在这里插入图片描述


    2 均值滤波

           均值滤波是指任意一点的像素值,都是周围 N \times M 个像素值的均值。例如下图中,红色点的像素值是其周围蓝色背景区域像素值之和除25,25=5\times5 是蓝色区域的大小。
    在这里插入图片描述
    均值滤波详细的计算方法如下图所示:
    在这里插入图片描述
    其中5x5的矩阵称为核,针对原始图像内的像素点,采用核进行处理,得到结果图像,如下图所示:
    在这里插入图片描述
    在这里插入图片描述
    提取 1/25 可以将核转换为如下形式:
    在这里插入图片描述

    • Python调用OpenCV实现 均值滤波 的函数如下: result = cv2.blur(原始图像,核大小)
      其中,核大小是以(宽度,高度)表示的元组形式。常见的形式包括:核大小(3,3)和(5,5)。
                                            在这里插入图片描述
      (1) 核大小为 3 x 3
                    代码如下所示:

           # encoding:utf-8
           import cv2
           import numpy as np
           import matplotlib.pyplot as plt
            
           # 读取图片
           img = cv2.imread('zxp_noise.jpg')
           source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            
           # 均值滤波
           result = cv2.blur(source, (3, 3)) #可以更改核的大小
            
           # 显示图形
           titles = ['Source Image', 'Blur Image (3, 3)']
           images = [source, result]
           for i in range(2):
               plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
               plt.title(titles[i])
               plt.xticks([]), plt.yticks([])
           plt.show()
      

    运行结果如下图所示:
    在这里插入图片描述
    (2) 核大小为 5 x 5:
                  代码如下所示:

    	     # encoding:utf-8
    	    import cv2
    	    import numpy as np
    	    import matplotlib.pyplot as plt
    	     
    	    # 读取图片
    	    img = cv2.imread('zxp_noise.jpg')
    	    source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    	     
    	    # 均值滤波
    	    result = cv2.blur(source, (5, 5)) #可以更改核的大小
    	     
    	    # 显示图形
    	    titles = ['Source Image', 'Blur Image (5, 5)']
    	    images = [source, result]
    	    for i in range(2):
    	        plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
    	        plt.title(titles[i])
    	        plt.xticks([]), plt.yticks([])
    	    plt.show()
    

    运行结果如下图所示:
    在这里插入图片描述
    (2) 核大小为 10x10
                 代码如下所示:

    	     # encoding:utf-8
    	    import cv2
    	    import numpy as np
    	    import matplotlib.pyplot as plt
    	     
    	    # 读取图片
    	    img = cv2.imread('zxp_noise.jpg')
    	    source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    	     
    	    # 均值滤波
    	    result = cv2.blur(source, (10, 10)) #可以更改核的大小
    	     
    	    # 显示图形
    	    titles = ['Source Image', 'Blur Image (10, 10)']
    	    images = [source, result]
    	    for i in range(2):
    	        plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
    	        plt.title(titles[i])
    	        plt.xticks([]), plt.yticks([])
    	    plt.show()
    

    运行结果如下图所示:
    在这里插入图片描述

        注:
        
        1)随着核大小逐渐变大,会让图像变得更加模糊;
        
        2)如果设置为核大小为(1,1),则结果就是原始图像。
    

    3 中值滤波

         在使用邻域平均法去噪的同时也使得边界变得模糊。而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。计算过程如下图所示:
    在这里插入图片描述
         Python调用OpenCV实现 中值滤波 的函数如下:

         OpenCV主要调用 medianBlur() 函数实现中值滤波。图像平滑里中值滤波的效果最好。

        dst = cv2.medianBlur(src, ksize)
        
        其中,参数:
        
        src 表示源图像;
        
        ksize 表示核大小。核必须是大于1的奇数,如3、5、7等。
    

    (1)核大小为 3x3
             代码如下所示:

        # encoding:utf-8
        import cv2
        import numpy as np
        import matplotlib.pyplot as plt
         
        # 读取图片
        img = cv2.imread('zxp_noise.jpg')
         
        # 中值滤波
        result = cv2.medianBlur(img, 3)#可以更改核的大小
         
        # 显示图像
        cv2.imshow("source img", img)
        cv2.imshow("medianBlur", result)
         
        # 等待显示
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    运行结果如下图所示:
    在这里插入图片描述
    (2)核大小为 5x5
             代码如下所示:

        # encoding:utf-8
        import cv2
        import numpy as np
        import matplotlib.pyplot as plt
         
        # 读取图片
        img = cv2.imread('zxp_noise.jpg')
         
        # 中值滤波
        result = cv2.medianBlur(img, 5) #可以更改核的大小
         
        # 显示图像
        cv2.imshow("source img", img)
        cv2.imshow("medianBlur", result)
         
        # 等待显示
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    运行结果如下图所示:
    在这里插入图片描述
    (3)核大小为 7x7
             代码如下所示:

        # encoding:utf-8
        import cv2
        import numpy as np
        import matplotlib.pyplot as plt
         
        # 读取图片
        img = cv2.imread('zxp_noise.jpg')
         
        # 中值滤波
        result = cv2.medianBlur(img, 7) #可以更改核的大小
         
        # 显示图像
        cv2.imshow("source img", img)
        cv2.imshow("medianBlur", result)
         
        # 等待显示
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    运行结果如下图所示:
    在这里插入图片描述

        注:
        
        1)随着核大小逐渐变大,会让图像变得更加模糊;
        
        2)核必须是大于1的奇数,如3、5、7等;
        
        3)在代码 dst = cv2.medianBlur(src, ksize) 中 填写核大小时,只需填写一个数即可,如3、5、7等,对比均值滤波函数用法。
    

    4 高斯滤波
         为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等。
         图像高斯平滑也是邻域平均的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予了不同的权重。高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值,下图的所示的 3\times3 和 5\times5 邻域的高斯模板。
    (1)核大小为 3x3
         在这里插入图片描述
    (1)核大小为 5x5
         在这里插入图片描述
         高斯滤波让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。如下图所示,中心位置权重最高为0.4。
    在这里插入图片描述
    在这里插入图片描述
         Python中OpenCV主要调用 GaussianBlur() 函数,如下:

        dst = cv2.GaussianBlur(src, ksize, sigmaX)
        
        其中,参数:
        
        src 表示原始图像;
        
        ksize 表示核大小;
        
        sigmaX 表示X方向方差。
        
        注:核大小(N, N)必须是奇数,X方向方差主要控制权重。
    

    1)核大小为 3x3
    在这里插入图片描述
    2)核大小为 5x5
    在这里插入图片描述
    (1)核大小为 3x3
             代码如下所示:

        # encoding:utf-8
        import cv2
        import numpy as np
        import matplotlib.pyplot as plt
         
        # 读取图片
        img = cv2.imread('zxp_noise.jpg')
        source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
         
        # 高斯滤波
        result = cv2.GaussianBlur(source, (3, 3), 0) #可以更改核大小
         
        # 显示图形
        titles = ['Source Image', 'GaussianBlur Image (3, 3)']
        images = [source, result]
        for i in range(2):
            plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
            plt.title(titles[i])
            plt.xticks([]), plt.yticks([])
        plt.show()
    

    运行结果如下图所示:
             在这里插入图片描述
    (1)核大小为 5x5
             代码如下所示:

        # encoding:utf-8
        import cv2
        import numpy as np
        import matplotlib.pyplot as plt
         
        # 读取图片
        img = cv2.imread('zxp_noise.jpg')
        source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
         
        # 高斯滤波
        result = cv2.GaussianBlur(source, (5, 5), 0) #可以更改核大小
         
        # 显示图形
        titles = ['Source Image', 'GaussianBlur Image (5, 5)']
        images = [source, result]
        for i in range(2):
            plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
            plt.title(titles[i])
            plt.xticks([]), plt.yticks([])
        plt.show()
    

    运行结果如下图所示:
             在这里插入图片描述

        注:
        
        1)随着核大小逐渐变大,会让图像变得更加模糊;
        
        2)核大小(N, N)必须是大于1的奇数,如3、5、7等;
    
    展开全文
  • 图像处理之滤波器介绍

    万次阅读 2017-07-09 20:36:40
    最近在看OpenCV 图像处理-平滑处理这个章节,于是呢,想着滤波器总结一下。这里主要是空间域滤波器的介绍,频率域以后再说吧。 首先分为平滑空间滤波器和锐化空间滤波器来进行介绍。平滑空间滤波器主要用于模糊处理...

        最近在看OpenCV 图像处理-平滑处理这个章节,于是呢,想着滤波器总结一下。这里主要是空间域滤波器的介绍,频率域以后再说吧。

    首先分为平滑空间滤波器和锐化空间滤波器来进行介绍。平滑空间滤波器主要用于模糊处理和降低噪声,主要两类:均值滤波器和中值滤波器。锐化空间滤波器主要是:拉普拉斯算子和梯度算子

    1、均值滤波器

           假设我们有一个3*3的模板,系数全为1,那么欲求的中心点像素值就是以该模板为中心的9个像素的平均值来代替。根据定义可知,该滤波器具有模糊边缘的负面效应。通过空间均值处理来模糊图像,可以突出感兴趣的物体,即将较部分图像融入背景中 ,部分图像‘突出显示’出来,达到平滑图像的作用,重点理解平滑对于图像的意义。

                                                                                                      

    MATLAB实现代码:

    set(gca,'Fontname','Monospaced');
    I=imread('a.tif');   
    subplot(231),imshow(I), title('origin image');  
    %I=rgb2gray(I);  
    %I1=imnoise(I,'salt & pepper',0.02);  
    %subplot(2 3 2)  
    %imshow(I1)  
    %title('添加椒盐噪声的图像');
    I1 = I;
    k1=filter2(fspecial('average',3),I1)/255; %进行3*3模板平滑滤波
    k2=filter2(fspecial('average',5),I1)/255; %进行5*5模板平滑滤波  
    k3=filter2(fspecial('average',7),I1)/255; %进行7*7模板平滑滤波  
    k4=filter2(fspecial('average',9),I1)/255; %进行9*9模板平滑滤波  
    k5=filter2(fspecial('average',15),I1)/255; %进行15*15模板平滑滤波  
    subplot(232),imshow(k1);title('3*3 smoothing filtering');  
    subplot(233),imshow(k2);title('5*5 smoothing filtering');  
    subplot(234),imshow(k3);title('7*7 smoothing filtering');  
    subplot(235),imshow(k4);title('9*9 smoothing filtering');  
    subplot(236),imshow(k5);title('15*15 smoothing filtering');  
    结果:可以看出,在模板逐渐扩大的过程中,图像的锯齿边缘被模糊掉,颗粒状的噪声也没有了,达到了我们想要的效果,但是在9*9甚至更大的模板,图像开始失真,图像过度模糊了。所以我们在图像平滑的时候,要选最佳的模板尺寸。



    2、中值滤波器

    中值滤波器是一种统计排序滤波器,即图像像素等于周围像素排序后的中值,加入模板为3*3,则目标点的像素等于排序后的第五个像素的值。中值滤波器特别适用于椒盐噪声。由定义知,中值滤波器对于孤立点特别敏感,还可以保持图像的边缘特性。由中值滤波扩展出来的还有最大值滤波器和最小值滤波器。

    MATLAB代码:

    %=======second part======
    I = imread('book_XRaySalt.tif');
    subplot(131),imshow(I);title('原椒盐噪声图像');
    
    k1=filter2(fspecial('average',3),I)/255; 	%进行3*3模板平滑滤波
    
    k2=medfilt2(I,[3,3]); 						%进行3*3模板中值滤波
    
    subplot(132),imshow(k1);title('3*3模板均值滤波');  
    subplot(133),imshow(k2);title('3*3模板中值滤波');
    I(100:110,100:110),
    k2(100:110,100:110),
    结果:


    增加:

          这里补充说下高斯滤波器,高斯滤波器是利用高斯核与输入图像的每个点进行卷积。提到高斯,就想到‘草帽’,更能记住它。

           高斯滤波器是一种平滑线性滤波器,使用高斯滤波器对图像进行滤波,其效果是降低图像灰度的“尖锐”变化,也就是使图像“模糊”了。高斯滤波对于抑制服从正态分布的噪声效果非常好,其代价是使图像变得“模糊”。当然,有时对图像进行平滑滤波的目的就是让图像变得模糊。

    一维高斯分布函数:                                                                                二维高斯分布函数:

                                                                    

            它们的图像分别为:                                                                      

        

    其3*3与5*5的卷积核对应如下:


    MATLAB实现:

    img = imread('lena.tif');
    w = fspecial('gaussian',[5,5],0.5);
    %replicate:图像大小通过赋值外边界的值来扩展
    %symmetric 图像大小通过沿自身的边界进行镜像映射扩展
    I = imfilter(img,w,'replicate');
    subplot(1,2,1);title('原图像');imshow(img);
    subplot(1,2,2);title('高斯滤波后的图像');imshow(I);
    

    从结果可以看出,图像整体模糊平滑了,特别是头发和帽子部分,是图像的尖锐变化被降低了吧。

    3、拉普拉斯算子进行图像锐化

    拉普拉斯算子是一种二阶微分算子,其强调的是图像中灰度的突变,通过将原图像和拉普拉斯图像加在一起,可以达到锐化图像的作用,最终在保留图像的背景信息的前提下从而突出细节。拉普拉斯锐化模板在边缘检测中非常有用。因为图像的边缘就是那些灰度跳变厉害的的区域。


    拉普拉斯算子模板:


    实现代码:

    %=============================================================
    f=imread('moon.jpg');
    subplot(2,3,1),imshow(f);  
    title('原图像'); 
    
    w4=fspecial('laplacian',0),
    g1=imfilter(f,w4,'replicate');
    subplot(2,3,2),imshow(g1); title('拉普拉斯模板滤波后的图像'); 
    
    f2=im2double(f);%将f转换归一化的double类图像,然后进行滤波
    g2=imfilter(f2,w4,'replicate');
    % imshow(img,[low high])  [low high]用于指定图像显示的灰度范围 对于double数据认为是0-1范围内
    subplot(2,3,3),imshow(g2,[]);   title('含有负值的滤波结果'); 
    
    g=f2-g2;
    subplot(2,3,4),imshow(g);title('原图-含有负值的滤波结果');
    
    %w8=[0 1 0;1 -4 1;0 1 0],
    w8=[1 1 1;1 -8 1;1 1 1],
    g8=f - imfilter(f,w8,'replicate');
    subplot(2,3,5),imshow(g8);title('对角线中心为8的拉普拉斯模板');
    
    
    %=============================================================


    4、梯度算子进行图像锐化

        相比于拉普拉斯二阶微分算子,梯度算子一一阶微分算子,更为简单。其实个人觉得,把梯度算子放在‘边缘检测’更为合适。


    f(x,y)在X方向和Y方向的梯度:

    经典模板:

    代码实现:
    代码中增加注释,很详细的介绍了求梯度算子锐化的过程。
    %   soble algorithm
    %   ZhangFL at SWPU  2017.04.26
    %   Sobel算子中的垂直模板得到的梯度图,由于梯度方向与边缘走向垂直,所以该梯度图对水平边缘有较强的响应,从而水平细节信息非常清晰。
    %   sobel算子中的水平模板得到的梯度图,它对垂直边缘有较强的响应,垂直细节非常清晰。
    %   Sobel算子水平和垂直方向叠加的梯度图,水平和垂直细节都非常清晰。
     A=imread('house.tif');  
     %I=rgb2gray(A);
      I=A;
     
     subplot(2,2,1); 
     imshow(I);  
     title('原图'); 
     
      k2=filter2(fspecial('average',5),I)/255; %进行5*5模板平滑滤波
      I=k2;
      hx=[-1 -2 -1;0 0 0 ;1 2 1],  %产生sobel垂直梯度模板
      hy=hx',                    %产生sobel水平梯度模板
      
      gradx=filter2(hx,I,'same');
      gradx=abs(gradx); %计算图像的sobel垂直梯度
      subplot(2,2,2);
      imshow(gradx,[]);
      title('图像的sobel垂直梯度');
      
      
      grady=filter2(hy,I,'same');
      grady=abs(grady); %计算图像的sobel水平梯度
      subplot(2,2,3);
      imshow(grady,[]);
       title('图像的sobel水平梯度');
       
       grad=gradx+grady;  %得到图像的sobel梯度
       subplot(2,2,4);
       imshow(grad,[]);
       title('图像的sobel梯度(使用5*5模板平滑滤波)');
       
       



    展开全文
  • 图像处理滤波算法

    万次阅读 2016-06-30 15:03:31
    一、学习心得: 在我学习基本滤波算法原理的时候,因为刚接触不是很理解算法具体是怎样实现的,不过在学习了图像形态学之后,发现滤波算法其实很简单。所以在此建议初学者在...而在图像处理中的滤波算法中,处理的

    一、学习心得:
    在我学习基本滤波算法原理的时候,因为刚接触不是很理解算法具体是怎样实现的,不过在学习了图像形态学之后,发现滤波算法其实很简单。所以在此建议初学者在学习滤波算法之前,可以先学习一下图像形态学,会达到事半功倍的效果。

    二、对于滤波功能的理解:
    滤波算法,可以理解成一种过滤算法,就像我们筛选产品时,把次品去除掉,只留下合格的产品。而在图像处理中的滤波算法中,处理的对象是图像,除了去除掉图像中不想要的像素点的值(如去除噪声),还可以加强图像中我们需要研究一些内容(如边缘提取)。

    三、滤波算法:
    这里所讲的算法都是针对图像空间的滤波算法,其中模板,可以理解为图像形态学中的结构元素,是用来选取图像中的那些像素点被用来操作的。空间滤波根据其功能划分为平滑滤波和锐化滤波。平滑滤波:能减弱或者消除图像中高频率分量,但不影响低频率分量,在实际应用中可用来消除噪声。锐化滤波:与平滑滤波相反,能减弱或者消除图像中低频率分量,但不影响高频率分量,可使图像反差增加,边缘明显。实际应用可用于增强被模糊的细节或者目标的边缘。

    空间增强滤波技术分类:
    这里写图片描述

    1、线性平滑滤波

    (1)方框滤波:用一个像素的领域像素值之和作为滤波结果,邻域即模板所覆盖的图像区域,此时模板的所有系数都为1.
    这里写图片描述

    这里写图片描述

    (2)邻域平均:是特殊大方框滤波,用一个像素的领域平均像素值作为滤波结果,即a为第一种情。
    这里写图片描述

    其中N(x,y)为模板岁覆盖的图像的区域,n为模板的尺寸。

    (3)加权平均:此时的模板系数不是1,而是具体的系数。一般认为距离模板中心的像素应对滤波结果有较大的贡献,所以可将接近模板中心的系数取得比模板周边的系数。
    这里写图片描述

    (4)高斯平均:是一种特殊的加权平均,只不过模板中的系数由高斯分布来确定的。

    2、线性锐化滤波

    (1)拉普拉斯算子
    拉普拉斯算子是一种各向同性的二阶微分算子,利用微分系数来确定模板系数,然后再与图像进行卷积运算,从而实现锐化滤波。

    根据拉普拉斯定义:
    这里写图片描述
    两个分别沿X和Y方向的二阶偏导均可借助差分计算:
    这里写图片描述
    合并为:
    这里写图片描述

    当模板为4-邻域时 当模板为8-邻域时

    这里写图片描述这里写图片描述

      以上两种模板的系数之和为0,这是为了使经过模板运算的图像的均值不变。拉普拉斯算子增强了图像中的灰度不连续区域,而减弱了图像中灰度值缓慢变化区域对比度,将这样的结果叠加到原始图像中,就可以得到瑞华后的额图像。
    

    (2)高频提升滤波
    图像的锐化效果可以通过叠加图像的微分结果得到,也可以通过减除图像积分结果得到。
    设原始图像为f(x,y),平滑后的图像为g(x,y):

    非锐化掩模:h(x,y) = f(x,y)-g(x,y)

    锐化图像:{ f(x,y)- g(x,y) } + f(x,y)

    高频提升滤波:把院士图形乘以一个放大系数A,再减去平滑图像

    这里写图片描述
    可转化为:
    这里写图片描述
    当A=1时,为非锐化掩模;
    当A=2时,为非锐化掩模化。

    3、非线性平滑滤波

    (1)中值滤波:对模板下对应的像素值进行升序排序,选取中间值作为结果。
    这里写图片描述
    (2)与中值滤波类似的,还有最大值、最小值、中点滤波
    这里写图片描述

    以上四种滤波也称之为百分比滤波,百分比滤波基于模板的排序来工作,又叫作序统计滤波。

    展开全文
  • 数字图像处理之频域滤波

    万次阅读 2018-07-10 18:02:23
    发现因为是走马观花的过了一遍,所以看得稀里糊涂的,然后许多地方混淆了概念,特别是关于图像频率域的部分的理解(包括图像频率域滤波之类的),所以下面总结一下这段时间重新看《数字图像处理》(电子工业出版社,...

    前段时间看了很多的概念和知识,发现因为是走马观花的过了一遍,所以看得稀里糊涂的,然后许多地方混淆了概念,特别是关于图像频率域的部分的理解(包括图像频率域滤波之类的),所以下面总结一下这段时间重新看《数字图像处理》(电子工业出版社,Matlab本科教学版)第三章重新收获的关于频率域的理解。

    首先,我们要明确的概念是空间域和频率域,我们通过imread函数得到的一幅图像(基本上也是我们平时说的图像),是处在空间域的,也就是说用f(x,y)表征的某一点的灰度值(或者是单色图像中某一点的亮度)的这种形式,就是在空间域里面。

    那么什么是图像的频率域呢?理解了图像的频率的概念,就不难理解频率域。我个人理解是这么类比的,图像可以看成是一个特殊的二维的信号,然后某一点的灰度级,其实就是图像信号上这一点的”幅度“,那么根据信号的概念,频率就是信号变化的快慢,这样就好理解了,所谓的频率也就是这个图空间上的灰度变换的快慢,或者是叫图像的梯度变化,什么地方梯度频率比较大呢?这在图像中自然是“边界”比较大。举个例子来讲,如果一幅图整体变化不大(比如说是一面墙的图),那么他在频率域下低频成分就很多,而高频成分就极少。而显然如果是一幅国际象棋棋盘,他的高频成分相对刚才那幅墙的图片来说,肯定多得多。

    然后从图像域变换到频率域,我们用的函数就是大名鼎鼎的二维离散傅里叶变换了:

    令f(x,y)表示一幅大小为MXN像素的数字图像,其中,x=0,1,2······M-1, y=0,1,2······N-1,由F(u,v)表示的f(x,y)的二维离散傅里叶变换(DFT)由下式给出:


    式子当中,u也是属于0到M-1,v属于0到N-1。频率域就是属于u,v作为频率变量,由F(u,v)构成的坐标系,这块MXN的区域我们通常称为频率矩形,很明显频率矩形的大小和输入图像的大小相同。

    有傅里叶变换,当然就有傅里叶反变换(IDFT):


    这里多提一句,按照书上的说法,在DFT的表达式中,1/MN项出现在正变换前面,而在有些表达式中就如上式那样出现在反变换前面,因为Matlab采用的是后者,所以书上的公式就是用的上式那种了。

    由上面的公式可以看出几个点:

    1.    不难看出,F(0,0)等于f(x,y)平均值的MN倍,因为带入到傅里叶变换公式中可以得到F(0,0)实际上就是图像中所有f(x,y)求和。所以我们也常把F(0,0)称作傅里叶变换的直流分量。

    2.    我们可以很明显的看出,在频率域中的一点(u,v)的值F(u,v),他并不决定于空间域中(x,y)的值,而是跟整个图像空间域中的所有的点都有关系,因此,在频率域中的一点(u,v)的值,例如说F(5,5)和空间域上的这一点f(5,5)并没有什么关系,而是决定于整幅图像。

    接下来书上讲了傅里叶变换的一些性质,还有傅里叶谱,变换的相角定义,功率谱定义等等概念,因为打公式太麻烦,这里就不多赘述了,可以在网上找到现成的公式定义和概念。

        傅里叶变换性质里面个人认为比较重要的是周期性,因为周期性的缘故,所以在傅里叶变换过后的频率图里,四角的是低频分量(具体的我也不太清楚,但是比如低频分量),我们到时候会把低频分量移到中心位置来,因为大部分图像的低频分量其实更多,所以会在边角上比较亮,放到中间来比较好看。

        下面举例一幅图说明看一幅频率域傅里叶谱图:

    1. f=imread(’3.jpg’);
    2. imshow(f);%显示原图
    3. F=fft2(f);%做傅里叶变换
    4. S=abs(F);%取傅里叶谱
    5. figure,imshow(S,[]);%显示傅里叶谱


     

        

    左图是原图,右图是频率图,频率图中的亮暗说明了对应频率的多少,上面已经谈过,如果从右图可以看出来是边上的四个点比较亮,这说明原图中低频分量比较多,也就是说原图中的变化比较少。换句话来说,如果原图看成地形的话,那说明大部分地形非常平坦。

    我们可以通过公式(欧拉公式e^(2*pi*j)=1以及指数的计算),可以很容易发现(图是盗的- -):


    上式最左边那个符号表示求傅里叶变换。由上式知道这么弄一番之后,是可以把频率图的原点放到中心的。

    在matlab中用的是fftshift函数。

    居中过后的频率谱显示如下:


    可以看得更清楚一些,这个时候因为其实频率谱的范围是很大的,相对于低频分量来说,高频分量的值比较少,所以可以用对数变换(log(1+abs(F))将高频细节扩展出来,显示如下:


    细节还是突出的比较明显的哈!

    下面谈谈对滤波的理解,不知道是不是完全正确

    滤波和算子都是数字图像处理的基本操作,其中滤波是指在像素领域(空间域)内做领域处理(中值滤波、均值滤波)或者在图像频域内(需要先做傅里叶变换)做处理(低通滤波、高通滤波、带通滤波)。算子一般就是指的是卷积算子了。

    先来谈谈空间域的滤波。什么叫领域处理呢?领域处理的就是对领域进行一系列的操作:

    (1)    选取中心点(x,y);

    (2)    仅对预先定义的点(x,y)的领域内的像素执行操作;

    (3)    令运算结果为该点处的响应;

    (4)    对图像中的每一点重复该处理。

    中心点移动的过程中会产生新的领域,每个领域对应输入图像上的一个像素。用来标识该处理的两个主要术语是领域处理和空间滤波,其中后者更为通用。如果对领域中像素执行的计算是线性的,则称该操作是线性空间滤波。(也用术语空间卷积);否则称为非线性空间滤波。

    线性操作包括领域中的每个像素乘以相应的系数,将结果求和,从而得到点(x,y)处的响应。若领域的大小为mxn,则需要mn个系数。这些系数被排列为一个矩阵,称为滤波器(模板)/滤波模板/核/掩模或者窗口。其中前三个属于最常见。为变得更明显一些,也用卷积滤波、卷积模板或者卷积核等术语。

    再来说下卷积算子是个什么意思:

    在这里盗一下网上的图:


    然后如上所示,图片中右上角的那个矩阵h=[2 9 4;

                                            7 5 3;

                                            6 1 8;]

    就是后面经常提到的模板了,在相关书本上一般也写作w(x,y)。如果把基于乘积和的值用来替代成原来的(x,y)的值,那么这种滤波方式叫做线性滤波(比如拉普拉斯算子)。其他的叫做非线性滤波。

    空间域滤波的最常见的就是中值滤波和均值滤波,顾名思义,中值滤波就是用图像领域中所包含的像素的排序集合的中值进行替代,而均值滤波是用领域像素们的均值进行滤波。中值滤波也属于统计排序滤波。

    接下来介绍频率域的滤波:

    首先,有个定理,叫做卷积定理:

       f(x,y)★h(x,y)óH(u,v)F(u,v)

    上式中★代表卷积,ó代表一个傅里叶变换对。

    频率域的滤波比较多的就是高斯低通/高斯高通滤波器了,和空间域稍微有区别的是,在频率域内不是进行的领域处理,而是进行的是函数修改:

    G(u,v)= H(u,v)F(u,v)

    函数H(u,v)又叫做滤波器传递函数,频率域滤波的思想就是选择一个滤波器传递函数,该函数按照指定的方式修改F(u,v)。

    由卷积定理可知,在频率域中让F(u,v)乘以空间滤波器的傅里叶变换H(u,v),再做一个傅里叶反变换,就可以得到用空间域滤波器滤波后的图像了(这也是相当于用DFT的方式在做卷积,用这种方式做卷积又叫循环卷积)。

    值得一提的是,注意,当作循环卷积的时候,因为F和H都是周期函数,所以G必然也是周期函数,在周期接近函数非零部分的持续周期时对周期函数进行卷积会引起相邻周期的串扰(这种串扰又叫折叠误差),所以要通过补零的方法来避免。比较拗口,还是举例来说明:一个上黑下白的方块图片,在DFT卷积的时候我们假设在处理上边沿了,结果因为是周期的所以上边沿其实在处理时会受到上边沿上面另一个方块的下边沿的白色部分的影响(具体的例子见书P63页),补0之后就不会受影响了。

     


                </div>
    
    展开全文
  • 图像频域滤波处理

    万次阅读 2015-04-23 21:32:54
    编程实现图像的频域滤波处理。 低通滤波处理,比较理想滤波器和实际滤波器的处理效果。 高通滤波处理,比较理想滤波器和实际滤波器的处理效果。
  • 滤波器作为图像处理课程的重要内容,大致可分为两类,空域滤波器和频率域滤波器。本文主要介绍常用的四种滤波器:中值滤波器、均值滤波器、高斯滤波器、双边滤波器,并基于opencv做出实现。空域的滤波器一般可以通过...
  • 图像处理的几种滤波

    万次阅读 2018-06-19 01:57:50
    均值滤波均值滤波,是图像处理中最常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高频信号将会去掉,因此可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。理想的均值滤波是用每个像素和它周围像素...
  • 图像滤波算法总结

    万次阅读 多人点赞 2018-09-11 00:01:13
    该篇主要是对图像滤波算法一个整理,主要参考的大神的博客: https://blog.csdn.net/qq_15606489/article/details/52755444 1:图像滤波既可以在实域进行,也可以在频域进行。图像滤波可以更改或者增强图像。通过...
  • 最近在看引导滤波,但是好些地方弄不明白,谁能告诉我那个引导图像是什么?要怎么得到?为什么有些地方又可以直接用输入的待滤波图像
  • 高通滤波:边缘提取与增强低通滤波:边缘平滑边缘区域的灰度变换加大,也就是频率较高。所以,对于高通滤波,边缘部分将被保留,非边缘部分将被过滤;对于低通滤波,边缘区域将被平滑过渡。
  • MATLAB图像处理_同态滤波

    万次阅读 多人点赞 2015-01-20 18:47:40
    同态滤波: 利用广义叠加原理对同态系统进行滤波。 同态滤波是把频率过滤和灰度变换结合起来的一种图像处理方法
  • 图像处理中,经常需要对图像进行平滑、锐化、边界增强等滤波处理。在使用PIL图像处理库时,我们通过Image类中的成员函数filter()来调用滤波函数对图像进行滤波,而滤波函数则通过ImageFilter类来定义的。
  • 图像处理之低通滤波

    万次阅读 2018-08-25 18:45:54
    图像处理或者计算机视觉应用中,在正式对图像进行分析处理前一般需要一个预处理的过程。预处理是对图像作一些诸如降维、降噪的操作,主要是为后续处理提供一个体积合适的、只包含所需信息的图像。这里通常会用到...
  • 中值滤波matlab

    万次阅读 2016-04-07 09:17:00
    摘 要 中值滤波技术是一种在去除噪声的同时能较好保护图像边缘细节的非线性技术,在图像增强和恢复等领域中得到了广泛的应用...中值滤波图像处理,MATLAB 1. 引言 数字图像是建立在人眼的感光特性和大
  • 图像处理滤波和卷积是常用到的操作。很多人认为卷积就是滤波,两者并无区别,其实不然。两者在原理上相似,但是在实现的细节上存在一些区别。这篇博文主要叙述这两者之间的区别。 1、滤波 简单来说,滤波操作...
  • Matlab图像处理之均值滤波

    千次阅读 2017-11-25 21:53:08
    图像的空间域滤波属于空间运算方法,例如中值滤波、均值滤波,用途主要是降噪。今天写的Matlab代码为均值滤波源代码: clear all close all clc %%%%%%%%%%%%%%%%%%%%%%%%%%%%% 读入待检测图像 x= ...
  • 图像平滑处理-中值滤波

    万次阅读 2018-11-06 15:57:18
    图像滤波:即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 消除图像中的噪声...
  • 均值滤波和中值滤波

    万次阅读 多人点赞 2018-02-05 20:19:58
    均值滤波采用线性的方法,平均整个窗口范围内的像素值,均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。均值滤波...
  • 线性滤波和非线性滤波

    万次阅读 2017-10-22 16:05:22
    图像的空域线性滤波和非线性滤波在空域对图像进行滤波处理无非两种情况,线性滤波和非线性滤波滤波的意思就是对原图像的每个像素周围一定范围内的像素进行运算,运算的范围就称为掩膜或领域。而运算就分两种了,...
  • %读取并显示原有图像 subplot(1,2,1); imshow(oriImg); title ('原始图像');%显示原始图像 grayImg = rgb2gray(oriImg);%转成灰度图像 subplot(1,2,2); imshow(grayImg); title ('灰度图像');%显示灰度图像 figur
1 2 3 4 5 ... 20
收藏数 40,408
精华内容 16,163
关键字:

图像处理滤波