python中图像模糊算法(均值,中值,自定义模糊),边缘保留滤波算法参数说明

模糊处理算法

      均值模糊--------------------------------------------------------------blur()

      中值模糊-------------------------椒盐噪声处理效果非常明显--------------------medianBlur()

      高斯模糊-------------------------产生毛玻璃效果----------------------------------GaussianBlur()

      自定义模糊----------------------图像锐化有明显效果

边缘保留的模糊处理算法

       高斯双边滤波-----------------效果类似磨皮---------------------------------- ---bilateralFilter()

       均值迁移滤波-----------------磨皮效果经常会过度模糊-------------------------pyrMeanShiftFiltering()

       局部均方差滤波均值迁移滤波(后续补充)

函数参数说明

均值模糊

blur( src, ksize [ , dst [ , anchor [ , borderType ]]] )

        src:输入图像;图像可以有任意数量的通道,单独处理,但深度应为cv8u、cv16u、cv16s、cv32f或cv64f。

        ksize:模糊核大小(x,y分别控制不同纬度的模糊程度)

中值模糊

        medianBlur( src, ksize [ , dst ] )

        src:输入1、3或4通道图像;当ksize为3或5时,图像深度应为cv8u、cv16u或cv32f,对于较大的光圈尺寸,只能为cv8u

       Ksize:必须为奇数且大于1,例如:3、5、7....

高斯模糊

      GaussianBlur( src, ksize, sigmaX [ , dst [ , sigmaY [ , borderType ]]] )

      src:输入图像;图像可以有任意数量的通道,单独处理,但深度应为cv8u、cv16u、cv16s、cv32f或cv64f。

     ksize:高斯核大小。ksize.width和ksize.height可以不同,但它们都必须是正数和奇数。或者,它们可以是零,然后根据sigma*计算。

     sigmaX:X方向高斯核标准差(sigmaX和ksize和知道一个就可以推导出另外一个,也就是说设置一个就可以)

自定义模糊

        cv2.filter2D( src, ddepth, kernel [ , dst [ , anchor [ , delta [ , borderType ]]]] )

        src:输入图像

        ddepth:目标图像的所需深度;如果为负,则与src.depth()相同;以下COM

                    –src.depth()=cv8u,ddepth=-1/cv16s/cv32f/cv64f

                   –src.depth()=cv_16u/cv_16s,ddepth=-1/cv_32f/cv_64f

                   –src.depth()=cv32f,ddepth=-1/cv32f/cv64f

                   –src.depth()=cv64f,ddepth=-1/cv64f

                   当ddepth=-1时,输出图像的深度将与源图像的深度相同。

         kernel:卷积核(或更确切地说是相关核),一个单通道浮点矩阵;如果要将不同的核应用于不同的通道,请使用split()将图像分割成单独的颜色平面,并分别处理它们。自定义kernel:可以每一项为奇数;或者和为0或者1,0时用来作边缘梯度,1时作增强.

高斯双边模糊

       cv2.bilateralFilter( src, d, sigmaColor, sigmaSpace [ , dst [ , borderType ]] )函数定义

       src: 输入8位或浮点、1通道或3通道图像

      d:过滤过程中使用的每个像素邻域的直径。如果它不是正的,它是从sigmaspace计算出来的。(这个值如果打算让函数自己算则设置为0,函数会根据sigmaspace计算出来)

      sigmaColor:过滤颜色空间参数sigma。参数的较大值意味着像素邻域中的更多颜色(请参见sigmaspace)将混合在一起,从而形成较大的半等色区域。(说白了就是把差异更大的颜色看作相似进行运算,这个值可以取得大一些,这样可以把差异小的点模糊掉)

     sigmaSpace:坐标空间中过滤参数sigma。参数的较大值意味着只要像素的颜色足够接近,就有更多的像素会相互影响(颜色相近的前期下有更多的像素点参与运算,该参数影响每次参与运算像素点的个数,请参见sigmacolor)。当d>0时,它指定邻域大小,而不考虑sigmaspace(d>0时d说了算,sigmaspace不起作用)。否则,d与sigmaspace成正比。(取值技巧:取值偏小一些,降低运算量)

均值迁移滤波

       pyrMeanShiftFiltering( src, sp, sr [ , dst [ , maxLevel [ , termcrit ]]] )

       src:输入8位3通道图像

       sp:空间窗口半径   (取值技巧:偏小降低运算)

       sr:颜色窗口半径   (取值技巧:偏大              )

# -*- coding=GBK -*-
#高斯双边 均值迁移 局部均方差  边缘保留滤波算法
import cv2 as cv
import numpy as np


def blur_image(src1):
    src2 = cv.blur(src1, (5, 5))
    cv.namedWindow("mean blur",cv.WINDOW_AUTOSIZE)
    cv.imshow("mean blur", src2)

    src2 = cv.medianBlur(src1, 5)
    cv.namedWindow("median blur",cv.WINDOW_AUTOSIZE)
    cv.imshow("median blur", src2)

    src2 = cv.GaussianBlur(src1, (0, 0), 4)
    cv.namedWindow("gaussian blur",cv.WINDOW_AUTOSIZE)
    cv.imshow("gaussian blur", src2)

    src2 = cv.bilateralFilter(src1, 0, 150, 10)
    cv.namedWindow("bilatera filter",cv.WINDOW_AUTOSIZE)
    cv.imshow("bilatera filter", src2)

    src2 = cv.pyrMeanShiftFiltering(src1,5,10)
    cv.namedWindow("pyrMeanShiftFiltering filter",cv.WINDOW_AUTOSIZE)
    cv.imshow("pyrMeanShiftFiltering filter", src2)

#自定义模糊函数
def self_define_image(src1):
    kernel1 = np.ones((5, 5), np.float)/25#自定义矩阵,并防止数值溢出
    src2 = cv.filter2D(src1, -1, kernel1)#均值
    cv.imshow("self define mean flur", src2)
    kernel2 = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
    src2 = cv.filter2D(src1, -1, kernel2)#锐化
    cv.imshow("self define sharpening", src2)


src = cv.imread("/home/xhy/PycharmProjects/materials/demo2.jpeg")
cv.namedWindow("raw", cv.WINDOW_NORMAL)
cv.imshow("raw", src)
blur_image(src)
self_define_image(src)
cv.waitKey(0)
cv.destroyAllWindows()

    

    

猜你喜欢

转载自blog.csdn.net/wx601056818/article/details/86507438