精华内容
下载资源
问答
  • 图像平滑

    2018-08-16 19:09:33
    官网原文:图像平滑(Smoothing Images) 2D卷积 == 图像滤波 低通滤波器(low-pass filters(LPF)):低通滤波器去噪音,并且模糊图片等. 高通滤波器(high-pass filters(HPF)):高通滤波器有助于找到图像边缘. ...

    官网原文:图像平滑(Smoothing Images)


    2D卷积 == 图像滤波

    低通滤波器(low-pass filters(LPF)):低通滤波器去噪音,并且模糊图片等.
    高通滤波器(high-pass filters(HPF)):高通滤波器有助于找到图像边缘.

    OpenCV提供了一个函数用来计算图片与核的卷积: cv.filter2D().

    例如,我们将尝试对图像进行均值滤波。 5x5均值滤波器内核如下所示:

    这里写图片描述

    工作原理:将该核保持在像素上方,相加该核下方的所有像素,取其平均值并用新的平均值替换中心像素。它继续对图像中的所有像素执行此操作。

    图像模糊 == 图像平滑

    图像模糊 = 原图像 低通滤波器核

    它有助于消除噪音。它实际上从图像中去除了高频内容(例如:噪声,边缘)。因此在此操作中边缘会模糊一点。 (嗯,有模糊的技术,也不会模糊边缘)。 OpenCV主要提供四种模糊技术。

    1.均值(Averaging)滤波

    结果 = 原图像 a normalized box filter

    它只取内核区域下所有像素的平均值并替换中心元素。

    函数: cv.blur() or cv.boxFilter()

    A 3x3 normalized box filter would look like below:
    这里写图片描述

    2.平滑高斯滤波(Gaussian Blurring)

    函数:cv.GaussianBlur()

    高斯模糊,在从图像中去除高斯噪声方面非常有效。

    3.中值滤波(Median Blurring)

    函数: cv.medianBlur()

    有效去除椒盐噪声.

    4.双边滤波(Bilateral Filtering)

    函数:cv.bilateralFilter()

    展开全文
  • 本篇文章主要讲解Python调用OpenCV实现图像平滑,包括四个算法:均值滤波、方框滤波、高斯滤波和中值滤波。全文均是基础知识,希望对您有所帮助。知识点如下: 1.图像平滑 2.均值滤波 3.方框滤波 4.高斯滤波 5.中值...

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

    本篇文章主要讲解Python调用OpenCV实现图像平滑,包括四个算法:均值滤波、方框滤波、高斯滤波和中值滤波。全文均是基础知识,希望对您有所帮助。知识点如下:

    • 1.图像平滑
    • 2.均值滤波
    • 3.方框滤波
    • 4.高斯滤波
    • 5.中值滤波

    PS:本文介绍图像平滑,想让大家先看看图像处理的效果,后面还会补充一些基础知识供大家学习。文章参考自己的博客及网易云课堂李大洋老师的讲解,强烈推荐大家学习。

    该系列在github所有源代码:

    PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

    同时推荐作者的C++图像系列知识:

    前文参考:

    PSS:2019年1~2月作者参加了CSDN2018年博客评选,希望您能投出宝贵的一票。我是59号,Eastmount,杨秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index

    五年来写了314篇博客,12个专栏,是真的热爱分享,热爱CSDN这个平台,也想帮助更多的人,专栏包括Python、数据挖掘、网络爬虫、图像处理、C#、Android等。现在也当了两年老师,更是觉得有义务教好每一个学生,让贵州学子好好写点代码,学点技术,“师者,传到授业解惑也”,提前祝大家新年快乐。2019我们携手共进,为爱而生。


    一.图像平滑

    1.图像增强
    图像增强是对图像进行处理,使其比原始图像更适合于特定的应用,它需要与实际应用相结合。对于图像的某些特征如边缘、轮廓、对比度等,图像增强是进行强调或锐化,以便于显示、观察或进一步分析与处理。图像增强的方法是因应用不同而不同的,研究内容包括:(参考课件和左飞的《数字图像处理》)

    2.图像平滑
    图像平滑是一种区域增强的算法,平滑算法有邻域平均法、中指滤波、边界保持类滤波等。在图像产生、传输和复制过程中,常常会因为多方面原因而被噪声干扰或出现数据丢失,降低了图像的质量(某一像素,如果它与周围像素点相比有明显的不同,则该点被噪声所感染)。这就需要对图像进行一定的增强处理以减小这些缺陷带来的影响。
    简单平滑-邻域平均法

    3.邻域平均法
    图像简单平滑是指通过邻域简单平均对图像进行平滑处理的方法,用这种方法在一定程度上消除原始图像中的噪声、降低原始图像对比度的作用。它利用卷积运算对图像邻域的像素灰度进行平均,从而达到减小图像中噪声影响、降低图像对比度的目的。
    但邻域平均值主要缺点是在降低噪声的同时使图像变得模糊,特别在边缘和细节处,而且邻域越大,在去噪能力增强的同时模糊程度越严重。

    首先给出为图像增加噪声的代码。

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

    输出结果如下所示:



    二.均值滤波

    1.原理
    均值滤波是指任意一点的像素值,都是周围N*M个像素值的均值。例如下图中,红色点的像素值为蓝色背景区域像素值之和除25。

    其中红色区域的像素值均值滤波处理过程为: ((197+25+106+156+159)+ (149+40+107+5+71)+ (163+198+**226**+223+156)+ (222+37+68+193+157)+ (42+72+250+41+75)) / 25

    其中5*5的矩阵称为核,针对原始图像内的像素点,采用核进行处理,得到结果图像。

    提取1/25可以将核转换为如下形式:

    2.代码
    Python调用OpenCV实现均值滤波的核心函数如下:
    result = cv2.blur(原始图像,核大小)
    其中,核大小是以(宽度,高度)表示的元祖形式。常见的形式包括:核大小(3,3)和(5,5)。
    K=19[111111111](1) K=\frac{1}{9}\left[ \begin{matrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{matrix} \right] \tag{1}
    K=125[1111111111111111111111111](2) K=\frac{1}{25}\left[ \begin{matrix} 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ \end{matrix} \right] \tag{2}

    代码如下所示:

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

    输出结果如下图所示:

    核设置为(10,10)和(20,20)会让图像变得更加模糊。

    如果设置为(1,1)处理结果就是原图,核中每个权重值相同,称为均值。



    三.方框滤波

    方框滤波和均值滤波核基本一致,区别是需不需要均一化处理。OpenCV调用boxFilter()函数实现方框滤波。函数如下:
    result = cv2.boxFilter(原始图像, 目标图像深度, 核大小, normalize属性)
    其中,目标图像深度是int类型,通常用“-1”表示与原始图像一致;核大小主要包括(3,3)和(5,5),如下所示。

    K=19[111111111](3) K=\frac{1}{9}\left[ \begin{matrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{matrix} \right] \tag{3}
    K=125[1111111111111111111111111](4) K=\frac{1}{25}\left[ \begin{matrix} 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ \end{matrix} \right] \tag{4}

    normalize属性表示是否对目标图像进行归一化处理。当normalize为true时需要执行均值化处理,当normalize为false时,不进行均值化处理,实际上为求周围各像素的和,很容易发生溢出,溢出时均为白色,对应像素值为255。

    在图像简单平滑中,算法利用卷积模板逐一处理图像中每个像素,这一过程可以形象地比作对原始图像的像素一一进行过滤整理,在图像处理中把邻域像素逐一处理的算法过程称为滤波器。平滑线性滤波器的工作原理是利用模板对邻域内像素灰度进行加权平均,也称为均值滤波器。

    代码如下所示:

    #encoding:utf-8
    import cv2  
    import numpy as np  
    import matplotlib.pyplot as plt
     
    #读取图片
    img = cv2.imread('test01.png')
    source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
     
    #方框滤波
    result = cv2.boxFilter(source, -1, (5,5), normalize=1)
     
    #显示图形
    titles = ['Source Image', 'BoxFilter Image']  
    images = [source, result]  
    for i in xrange(2):  
       plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')  
       plt.title(titles[i])  
       plt.xticks([]),plt.yticks([])  
    plt.show()  
    

    代码中使用5*5的核,normalize=1表示进行归一化处理,此时与均值滤波相同,输出结果如下图所示:

    下面是图像左上角处理前后的像素结果:

    print(source[0:3, 0:3, 0])
    #[[115 180 106]
    # [ 83 152  72]
    # [ 55  58  55]]
    print(result[0:3, 0:3, 0])
    #[[92 90 78]
    # [92 89 77]
    # [82 80 72]]
    

    如果省略参数normalize,则默认是进行归一化处理。如果normalize=0则不进行归一化处理,像素值为周围像素之和,图像更多为白色。

    #encoding:utf-8
    import cv2  
    import numpy as np  
    import matplotlib.pyplot as plt
     
    #读取图片
    img = cv2.imread('test01.png')
    source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
     
    #方框滤波
    result = cv2.boxFilter(source, -1, (5,5), normalize=0)
     
    #显示图形
    titles = ['Source Image', 'BoxFilter Image']  
    images = [source, result]  
    for i in xrange(2):  
       plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')  
       plt.title(titles[i])  
       plt.xticks([]),plt.yticks([])  
    plt.show() 
    

    输出结果如下图所示:

    上图很多像素为白色,因为图像求和结果几乎都是255。如果设置的是2*2矩阵,只取四个像素结果要好些。
    result = cv2.boxFilter(source, -1, (2,2), normalize=0)



    四.高斯滤波

    为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等。
    图像高斯平滑也是邻域平均的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予了不同的权重。高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值,下图的所示的 3 * 3 和 5 * 5 领域的高斯模板。

    高斯滤波让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。如下图所示,中心位置权重最高为0.4。

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

    K(3,3)=[0.050.10.050.10.40.10.050.10.05](5) K(3,3)=\left[ \begin{matrix} 0.05 & 0.1 & 0.05 \\ 0.1 & 0.4 & 0.1 \\ 0.05 & 0.1 & 0.05 \end{matrix} \right] \tag{5}
    K(5,5)=[1121113431248421343111211](4) K(5,5)=\left[ \begin{matrix} 1 & 1 & 2 & 1 & 1 \\ 1 & 3 & 4 & 3 & 1 \\ 2 & 4 & 8 & 4 & 2 \\ 1 & 3 & 4 & 3 & 1 \\ 1 & 1 & 2 & 1 & 1 \\ \end{matrix} \right] \tag{4}

    代码如下:

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

    输出结果如下所示:

    如果使用15*15的核,则图形将更加模糊。



    五.中值滤波

    1.概念
    在使用邻域平均法去噪的同时也使得边界变得模糊。而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。 例如选择滤波的窗口如下图,是一个一维的窗口,待处理像素的灰度取这个模板中灰度的中值,滤波过程如下:

    如下图所示,将临近像素按照大小排列,取排序像素中位于中间位置的值作为中值滤波的像素值。

    2.代码
    OpenCV主要调用medianBlur()函数实现中值滤波。图像平滑里中值滤波的效果最好。
    dst = cv2.medianBlur(src, ksize)
    其中,src表示源文件,ksize表示核大小。核必须是大于1的奇数,如3、5、7等。

    代码如下所示:

    #encoding:utf-8
    import cv2  
    import numpy as np  
    import matplotlib.pyplot as plt
     
    #读取图片
    img = cv2.imread('test01.png')
     
    #高斯滤波
    result = cv2.medianBlur(img, 3)
    
    #显示图像
    cv2.imshow("source img", img)
    cv2.imshow("medianBlur", result)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    输出结果如下图所示:

    常用的窗口还有方形、十字形、圆形和环形。不同形状的窗口产生不同的滤波效果,方形和圆形窗口适合外轮廓线较长的物体图像,而十字形窗口对有尖顶角状的图像效果好。中值滤波对于消除孤立点和线段的干扰十分有用,尤其是对于二进噪声,但对消除高斯噪声的影响效果不佳。对于一些细节较多的复杂图像,可以多次使用不同的中值滤波。

    希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。
    (By:Eastmount 2018-09-01 早8点 https://blog.csdn.net/Eastmount/)


    2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。

    展开全文
  • 1 图像增强——图像平滑 1.1 图像增强简介 1.2 图像平滑 2 均值滤波 3 中值滤波 4 高斯滤波 参考资料 1 图像增强——图像平滑 1.1 图像增强简介 图像增强是对图像进行处理,使其比原始图像更适合于特定的...

    目录

    1 图像增强——图像平滑

    1.1 图像增强简介

    1.2 图像平滑

    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 是蓝色区域的大小。

     

    均值滤波详细的计算方法如下图所示:

     

    其中5\times5的矩阵称为,针对原始图像内的像素点,采用核进行处理,得到结果图像,如下图所示:

     

     

    提取 1/25 可以将核转换为如下形式:

    Python调用OpenCV实现 均值滤波 的函数如下:

    result = cv2.blur(原始图像,核大小)
    其中,核大小是以(宽度,高度)表示的元组形式。常见的形式包括:核大小(3,3)和(5,5)。

                                                                                   K=\frac{1}{9}\times \left[ \begin{matrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \\ \end{matrix} \right]     

                                                                          K=\frac{1}{25}\times \left[ \begin{matrix} 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ \end{matrix} \right]

     

    (1) 核大小为 3\times3

    代码如下所示:

    # 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\times5

    代码如下所示:

    # 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) 核大小为 10\times10

    代码如下所示:

    # 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)核大小为 3\times3

    代码如下所示:

    # 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)核大小为 5\times5

    代码如下所示:

    # 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)核大小为 7\times7

    代码如下所示:

    # 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)核大小为 3\times3

                                                                     \frac{1}{16}\times \left[ \begin{matrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \\ \end{matrix} \right]=\left[ \begin{matrix} {}^{1}\!\!\diagup\!\!{}_{16}\; & {}^{1}\!\!\diagup\!\!{}_{8}\; & {}^{1}\!\!\diagup\!\!{}_{16}\; \\ {}^{1}\!\!\diagup\!\!{}_{8}\; & {}^{1}\!\!\diagup\!\!{}_{4}\; & {}^{1}\!\!\diagup\!\!{}_{8}\; \\ {}^{1}\!\!\diagup\!\!{}_{16}\; & {}^{1}\!\!\diagup\!\!{}_{8}\; & {}^{1}\!\!\diagup\!\!{}_{16}\; \\ \end{matrix} \right]

     

    (1)核大小为 5\times5

                                                                              \frac{1}{273}\times \left[ \begin{matrix} 1 & 4 & 7 & 4 & 1 \\ 4 & 16 & 26 & 16 & 4 \\ 7 & 26 & 41 & 26 & 7 \\ 4 & 16 & 26 & 16 & 4 \\ 1 & 4 & 7 & 4 & 1 \\ \end{matrix} \right]

     

    高斯滤波让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。如下图所示,中心位置权重最高为0.4。

     

     

    Python中OpenCV主要调用 GaussianBlur() 函数,如下:

    dst = cv2.GaussianBlur(src, ksize, sigmaX)

    其中,参数:

    src 表示原始图像;

    ksize 表示核大小;

    sigmaX 表示X方向方差。

    :核大小(N, N)必须是奇数,X方向方差主要控制权重。

    1)核大小为 3\times3

                                                                        K=\left[ \begin{matrix} 0.05 & 0.1 & 0.05 \\ 0.1 & 0.4 & 0.1 \\ 0.05 & 0.1 & 0.05 \\ \end{matrix} \right]

    2)核大小为 5\times5

                                                                        K=\left[ \begin{matrix} 1 & 1 & 2 & 1 & 1 \\ 1 & 3 & 4 & 3 & 1 \\ 2 & 4 & 8 & 4 & 2 \\ 1 & 3 & 4 & 3 & 1 \\ 1 & 1 & 2 & 1 & 1 \\ \end{matrix} \right]

     

    (1)核大小为 3\times3

    代码如下所示:

    
    # 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()

     

    运行结果如下图所示:

     

    (2)核大小为 5\times5

    代码如下所示:

    # 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等;

     

     

    参考资料

    [1] https://blog.csdn.net/Eastmount/article/details/82216380

    [2] Python+OpenCV图像处理

     


     

    如果觉得内容还不错的话,欢迎点赞、转发、收藏,还可以关注微信公众号、CSDN博客、知乎。
     

    1. 微信公众号:

    2. CSDN博客:https://xiongyiming.blog.csdn.net/

    3. 知乎:https://www.zhihu.com/people/xiongyiming

     

    展开全文
  • 图像平滑处理-中值滤波

    万次阅读 多人点赞 2018-11-06 15:57:18
    图像平滑处理-中值滤波1.什么是滤波?2.平滑处理的目的3.平滑处理的应用4.中值滤波的处理方法5.中值滤波的示意图椒盐噪声6.椒盐处理和中值滤波的效果展示7.代码(面向过程)8.程序演示(面向对象) 1.什么是滤波? ...

    1.什么是滤波?

    图像滤波:即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。

    消除图像中的噪声成分叫作图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。

    2.平滑处理的目的

    图像滤波的目的有两个:

    一是抽出对象的特征作为图像识别的特征模式;
    另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声。

    而对滤波处理的要求也有两条:

    一是不能损坏图像的轮廓及边缘等重要信息;
    二是使图像清晰视觉效果好。

    3.平滑处理的应用

    关于滤波器,一种形象的比喻法是:
    我们可以把滤波器想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像之上,透过这个窗口来看我们得到的图像。

    举一个滤波在我们生活中的应用:
    美颜的磨皮功能。如果将我们脸上坑坑洼洼比作是噪声的话,那么滤波算法就是来取出这些噪声,使我们自拍的皮肤看起来很光滑。

    4.中值滤波的处理方法

    中值滤波是一种典型的非线性滤波,是基于排序统计理论的一种能够有效抑制噪声的非线性信号处理技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,让周围的像素值接近真实的值从而消除孤立的噪声点。该方法在取出脉冲噪声、椒盐噪声的同时能保留图像的边缘细节。这些优良特性是线性滤波所不具备的。

    中值滤波首先也得生成一个滤波模板,将该模板内的各像素值进行排序,生成单调上升或单调下降的二维数据序列,二维中值滤波输出为

    g(x, y)=medf{f(x-k, y-1),(k, l∈w)}

    	其中f(x,y)和g(x,y)分别是原图像和处理后图像, w为输入的二维模板,能够在整幅图像上滑动,通常尺寸为3*3或5*5区域,也可以是不同的形状如线状、圆形、十字形、圆环形等。通过从图像中的二维模板取出奇数个数据进行排序,用排序后的中值取代要处理的数据即可。 
    

    5.中值滤波的示意图

    首先,我们复习中值。在一连串数字{1,4,6,8,9}中,数字6就是这串数字的中值。由此我们可以应用到图像处理中。依然我们在图像中去3*3的矩阵,里面有9个像素点,我们将9个像素进行排序,最后将这个矩阵的中心点赋值为这九个像素的中值。

    引用

    中值滤波示意图

    椒盐噪声

    椒盐噪声(salt-and-pepper noise)是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。
      所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上随机出现黑色白色的像素。椒盐噪声是一种因为信号脉冲强度引起的噪声,产生该噪声的算法也比较简单。
      椒盐噪声往往由图像切割引起,去除脉冲干扰及椒盐噪声最常用的算法是中值滤波。大量的实验研究发现,由摄像机拍摄得到的图像受离散的脉冲、椒盐噪声和零均值的高斯噪声的影响较严重。噪声给图像处理带来很多困难,对图像分割、特征提取、图像识别等具有直接影响。因此,实时采集的图像需进行滤波处理。消除图像中的噪声成份叫做图像的平滑化或滤波操作。滤波的目的有两个:一是抽出对象的特征作为图像识别的特征模式;二是为适应计算机处理的要求,消除图像数字化时所混入的噪声。对滤波处理的要求有两条:一是不能损坏图像轮廓及边缘等重要信息;二是使图像清晰,视觉效果好。

    我们使用信噪比(Signal NoiseRate)衡量图像噪声,图象的信噪比应该等于信号与噪声的功率谱之比,但通常功率谱难以计算,有一种方法可以近似估计图象信噪比,即信号与噪声的方差之比(其实在均值为零的情况下,功率就是方差)。首先计算图象所有像素的局部方差,将局部方差的最大值认为是信号方差,最小值是噪声方差,求出它们的比值,再转成dB数,最后用经验公式修正。

    6.椒盐处理和中值滤波的效果展示

    在这里插入图片描述

    7.代码(面向过程)

    #%matplotlib inline
    from matplotlib import pyplot as plt
    import cv2
    import numpy as np
    from copy import deepcopy
    
    
    filename = input("请输入图像名称:")
    winname = "figure"
    img = cv2.imread(filename)
    
    def add_salt_noise(img, snr=0.5):
        # 指定信噪比
        SNR = snr
        # 获取总共像素个数
        size = img.size
        print(size)
        # 因为信噪比是 SNR ,所以噪声占据百分之10,所以需要对这百分之10加噪声
        noiseSize = int(size * (1 - SNR))
        # 对这些点加噪声
        for k in range(0, noiseSize):
            # 随机获取 某个点
            xi = int(np.random.uniform(0, img.shape[1]))
            xj = int(np.random.uniform(0, img.shape[0]))
            # 增加噪声
            if img.ndim == 2:
                img[xj, xi] = 255
            elif img.ndim == 3:
                img[xj, xi] = 0
        return img
    
    img_demo = deepcopy(img)
    snr = float(input("请输入一个信噪比(小数表示):"))
    img_salt = add_salt_noise(img_demo, snr)
    img_medianblur = cv2.medianBlur(img, 11)
    
    img_all = np.hstack([
        img, img_salt, img_medianblur
    ])
    
    plt.figure(figsize=(20,10))
    plt.imshow(img_all[:,:,::-1])
    plt.show()
    
    

    8.程序演示(面向对象)

    用tkinter 做的界面化处理操作

    面向对象制作的界面程序处理中值滤波

    完整代码(码云):码云分享
    完整代码(github):github分享

    觉得不错的朋友,可以与我交流关注,以及去码云和github点星,真的感谢!~

    有问题可以联系

    展开全文
  • 图像平滑滤波

    2019-10-17 18:08:21
    Introduction 滤波是一个信号处理领域的概念。信息通过波的形式传递,滤波就是通过提取相应的...许多与图像相关的工作都需要使用图像滤波做预处理,而图像平滑滤波也广泛应用于图像去噪、图像增强、图像融合、立体视...
  • 图像平滑处理

    2021-01-22 14:53:32
    目录图像平滑处理图像平滑处理原理图像平滑处理方法:均值滤波基本原理函数语法:dst=cv2.blue(src,ksize,anchor,borderType)例子方框滤波函数语法:dst=cv2.boxFilter(scr,ddepth,ksize,anchor,normalize,...
  • 图像平滑之平均平滑

    千次阅读 2016-11-25 09:45:23
    图像平滑中的平均平滑的实现
  • 图像平滑(图像模糊): 一幅图像和一个低通滤波器进行卷积,能够实现图像平滑效果,也就是图像模糊效果。平滑操作通常会从图像中移除高频信息(噪音、边缘)。所以图像平滑后,图像边缘往往会被模糊(本文介绍的...
  • 彩色图像--图像增强 图像平滑

    千次阅读 2015-03-17 15:20:18
    学习DIP第71天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!... 内容迁移至:http://www.tony4ai.com/DIP-10-2-彩色图像-图像增强-图像平滑/...
  • 转自:...目录 1 图像增强——图像平滑        1.1 图像增强简介        1.2 图像平滑 2 均值滤...
  • 图像平滑之高斯平滑(模糊)

    千次阅读 2016-11-25 09:53:20
    图像平滑中的高斯平滑的实现
  • python+opencv图像处理之六:图像平滑处理 目录python+opencv图像处理之六:图像平滑处理一、图像平滑二、均值滤波三、中值滤波四、方框滤波五、高斯滤波 一、图像平滑 图像平滑是指受传感器和外界因素的影响,图像...
  • 2、利用MATLAB进行频率域滤波,观察图像平滑和图像锐化的效果,加深对频率域滤波的理解; 3、掌握图像FFT变换与DCT变换后进行频率域滤波的不同; 4、掌握低通滤波与高通滤波原理,对DCT变换后的图像进行低通滤波和高通...
  • matlab图像平滑

    万次阅读 2017-01-01 18:02:24
    图像平滑的主要目的是减少图像噪声,噪声是普遍存在的额,图像中的噪声也是如此。图像噪声可能来自于很多因素,noise产生的原因决定了噪声分布的特性,由于这些特性的存在,可以有针对性地对noise进行抑制。 1.线性...
  • Python实现各种图像平滑

    千次阅读 2019-09-28 09:31:09
    1、高斯图像平滑 import cv2 import numpy as np import matplotlib.pyplot as plt from scipy import signal def gaussBlur(image,sigma,H,W,_boundary='fill',_fillvalue=0): gaussKenrnel_x=cv2....
  • 四种图像平滑方法 python代码

    千次阅读 2020-10-07 16:17:56
    1.图像平滑概述 图像平滑也称为图像去噪,是为了抑制图像噪声改善图像质量进行的处理。这种噪声可能是在图像获取和传输等过程中造成的,噪声会使图像恶化,质量下降,图像模糊,特征淹没,对图像分析很不利。 本文...
  • 噪声分类: 高斯噪声 是随机噪声, 服从高斯分布 ...图像平滑(去噪) 平滑的目的: 在表刘源是图像基本特征的前提下, 消除或衰减噪声的影响, 提高视觉效果 基础知识: (1): 滤波: 使用空间...
  • L0范数图像平滑

    万次阅读 2015-09-26 22:12:47
    图像平滑是计算摄影学一门基础重要的工具,其作用是拂去不重要的细节,保留较大的图像边缘,主要应用于边缘检测,JPEG压缩图像人工伪迹去除,非真实绘制等领域。 图像平滑大体上可以分为两类:基于局部和基于全局...
  • 图像滤波-图像平滑 在Halcon中,图像平滑通过smooth_image算子来实现,其原型如下: smooth_image(Image : ImageSmooth : Filter, Alpha : ) Image:输入图像。 ImageSmooth:平滑后的图像。 Filter:使用平滑...
  • 目录什么是图像平滑处理均值滤波方框滤波高斯滤波中值滤波双边滤波2D卷积 什么是图像平滑处理 在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一过程我们称之为图像的平滑处理,所得到的图像称为平滑图像...
  • 本节为opencv数字图像处理(3):灰度变换与空间滤波的第三小节,图像平滑与锐化,主要包括:平滑线性滤波器(均值、盒装etc)、统计排序滤波器(中值etc)、拉普拉斯算子、梯度算子、边缘检测算子的对比及其C++实现...
  • 文章目录空间域增强—图像平滑邻域平均法超限像素平滑法有选择保边缘平滑法中值滤波法 空间域增强—图像平滑 图像平滑也成为图像去噪,是为了抑制图像噪声改善图像质量进行的处理。这种噪声可能是在图像获取和传输...
  • 图像平滑处理会对图像中与周围像素点的像素值差异较大的像素点进行处理,将其值调整为周围像素点像素值的近似值。 图像平滑处理的基本原理是,将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值。取近似...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,987
精华内容 31,594
关键字:

图像平滑