模糊处理算法
均值模糊--------------------------------------------------------------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()