一、

图像滤波

1.滤波:过滤掉特定频率的波段,在图像处理中一般指去除图像噪声点,使图片整体变平滑

2.opencv提供的几种滤波函数

1)自定义滤波/二维滤波

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

src:原图像

ddepth:输出图像通道深度,-1表示与原图像通道深度相同

ksize:卷积核尺寸,通常为numpy二维数组

该函数将任意线性滤波器应用于图像,支持就地操作。当光圈部分位于图像外部时,该函数根据指定的边界模式插入异常值像素值。该函数实际上确实计算了相关性,而不是卷积:也就是说,内核不会在锚点周围进行镜像。如果你需要一个真正的卷积,用flip()翻转内核并将新锚设置为(kernel.cols - anchor.x - 1,kernel.rows - anchor.y - 1)。

Opencv提供的一个通用的2D滤波函数为cv2.filter2D(),滤波函数的使用需要一个核模板,对图像的滤波操作过程为:将和模板放在图像的一个像素A上,求与之对应的图像上的每个像素点的和,核不同,得到的结果不同,而滤波的使用核心也是对于这个核模板的使用,需要注意的是,该滤波函数是单通道运算的,也就是说对于彩色图像的滤波,需要将彩色图像的各个通道提取出来,对各个通道分别滤波才行。

2)盒式滤波

cv2.boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]])

src:原图像

ddepth:输出图像通道深度,-1表示与原图像通道深度相同

ksize:卷积核尺寸,通常为numpy二维数组

3)均值滤波

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

src:原图像,通道数任意

ksize:卷积核尺寸,二元元组

是归一化后的盒式滤波,由一个归一化卷积框完成,用卷积框覆盖区域所有像素的平均值来代替中心元素

4)高斯滤波

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

src:原图像,通道数任意

ksize:高斯核大小。 两值可以不同,但必须是正奇数。或者,为零根据sigma计算。也可以通过cv2.GaussianKernel()自己构造核。

sigmaX:高斯核在x方向的标准偏差

sigmaY:高斯核在y方向的标准偏差,为0时等于sigmaX,都为0时根据ksize计算

卷积核换成高斯核。现在里面的值是符合高斯分布的,方框中心的值最大,其余方框根据距离中心元素的距离递减,构成一个高斯小山包。原来的求平均数现在变成求加权平均数,全就是方框里的值)。实现的函数是 cv2.GaussianBlur()。我们需要指定高斯核的宽和高(必须是奇数)。以及高斯函数沿 X,Y 方向的标准差。如果我们只指定了 X 方向的的标准差,Y 方向也会取相同值。如果两个标 准差都是 0,那么函数会根据核函数的大小自己计算。高斯滤波可以有效的从 图像中去除高斯噪音。

5)中值滤波

cv2.medianBlur(src, ksize[, dst])

src:原图像,1、3或者4通道

ksize:正奇数

取核中每个像素的中值作为该像素的值,经常用来去除椒盐噪声

6)双边滤波

cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])

src:原图像,1、通道,8bit或float

d:过滤期间使用的每个像素邻域的直径。如果它是非正数,则从sigmaSpace计算

sigmaColor:色彩空间的sigma

sigmaSpace:协同空间的sigma

双边滤波在高斯滤波的基础上增加了灰度值的影响,可以有效地在保持边缘清晰的情况下去除噪声,但速度较慢。

二、

# coding:utf-8
# 
# https://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html
# 
# 

import cv2
import numpy as np

# 通用的2D滤波函数,需要用户自定义窗口模版,单通道运算
def custom2Dfilter(img):
    b,g,r = cv2.split(img)                          # 通道分离
    kernel = np.ones((5, 5), np.float32) / 25       # 滤波窗口

    b = cv2.filter2D(np.float32(b),-1,kernel)
    b = np.uint8(np.clip(b, 0, 255))
    g = cv2.filter2D(np.float32(g),-1,kernel)
    g = np.uint8(np.clip(g, 0, 255))
    r = cv2.filter2D(np.float32(r),-1,kernel)
    r = np.uint8(np.clip(r, 0, 255))

    return cv2.merge([b,g,r])

def boxFilter(img):
    return cv2.boxFilter(img,-1,(5,5))

def averageFilter(img):
    return cv2.blur(img,(3,5))

def medianFilter(img):
    return cv2.medianBlur(img,5)

def gaussianFilter(img):
    return cv2.GaussianBlur(img,(5,5),0)

def bilaterFilter(img):
    return cv2.bilateralFilter(img,9,75,75)





img = cv2.imread('image11.png',1)
cv2.imshow('src',img)
dst_cust2D = custom2Dfilter(img)
dst_ave = averageFilter(img)
dst_mid = medianFilter(img)
dst_gauss = gaussianFilter(img)
dst_bilat = bilaterFilter(img)
dst_box = boxFilter(img)

cv2.imshow('custom2D',dst_cust2D)
cv2.imshow('average',dst_ave)
cv2.imshow('median',dst_mid)
cv2.imshow('Guassian',dst_gauss)
cv2.imshow('bilateral',dst_bilat)
cv2.imshow('box',dst_box)

cv2.waitKey(0)
cv2.destroyAllWindows()