opencv图像滤波与增强(4):cv2.blur,cv2.boxFilter,cv2.Gaussianblur,cv2.medianBlur,cv2.bilateralFilter,cv2.equa

目录

 

1.线性滤波--均值滤波:cv2.blur(src,ksize,dst=None,anchor=None,borderType=None)

2.线性滤波--方框滤波:cv2.boxFilter(src,ddepth,ksize,dst=None,anchor=None,normalize=None,borderType=None)

3.线性滤波--高斯滤波:cv2.Gaussianblur(src,ksize,sigmaX,dst=None,sigmaY=None,borderType=None)

4.非线性滤波--中值滤波:cv2.medianBlur(src,ksize,dst=None)

5.非线性滤波--双边滤波:cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,dst=None,borderType=None)

6.直方图均衡化:cv2.equalizeHist(src,dst=None)

7.Gamma变换


1.线性滤波--均值滤波:cv2.blur(src,ksize,dst=None,anchor=None,borderType=None)

src表示源图像;ksize表示核大小;

均值滤波的卷积核为K=\1/(ksize.width*ksize.height) \begin{bmatrix} 1 ... 1 \\ . . . \\ 1 ... 1 \end{bmatrix}

blur = cv2.blur(img,(3,3 ))

2.线性滤波--方框滤波:cv2.boxFilter(src,ddepth,ksize,dst=None,anchor=None,normalize=None,borderType=None)

ddepth表示目标图像的深度;当normalize=True时,与均值滤波结果相同, normalize=False,表示对加和后的结果不进行平均操作,大于255的使用255表示。方框滤波用来模糊一张图片。

方框滤波的卷积核为:K=\alpha \begin{bmatrix} 1 ... 1 \\ . . . \\ 1 ... 1 \end{bmatrix},其中\alpha = \begin{cases} 1/(ksize.width*ksize.height)\text{ if } normalize=1 \\ 1 \text{ if } normalize= 0 \end{cases}

import cv2
import numpy as np
img = cv2.imread('girl2.png',cv2.IMREAD_UNCHANGED)
r = cv2.boxFilter(img, -1 , (7,7) , normalize = 1)
d = cv2.boxFilter(img, -1 , (3,3) , normalize = 0)
cv2.namedWindow('img',cv2.WINDOW_AUTOSIZE)
cv2.namedWindow('r',cv2.WINDOW_AUTOSIZE)
cv2.namedWindow('d',cv2.WINDOW_AUTOSIZE)
cv2.imshow('img',img)
cv2.imshow('r',r)
cv2.imshow('d',d)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.线性滤波--高斯滤波:cv2.Gaussianblur(src,ksize,sigmaX,dst=None,sigmaY=None,borderType=None)

ksize是高斯核大小,sigmaX为高斯函数在X轴上的标准差σ,调整σ实际是在调整周围像素对当前像素的影响程度,调大σ即提高了远处像素对中心像素的影响程度,滤波结果也就越平滑。sigmaY为高斯核函数在Y方向上的标准偏差,如果sigmaY是0,则函数会自动将sigmaY的值设置为与sigmaX相同的值,如果sigmaX和sigmaY都是0,这两个值将由ksize.width和ksize.height计算而来。

高斯滤波相对均值滤波效率要慢很多,但可以有效消除高斯噪声,能保留更多的图像细节

blur = cv.GaussianBlur(img,(7,7),7)

4.非线性滤波--中值滤波:cv2.medianBlur(src,ksize,dst=None)

中值滤波是一种非线性滤波器,是用像素点领域灰度值的中值代替该点的灰度值,中值滤波可以去除椒盐噪声和斑点噪声

median = cv.medianBlur(img,3)

5.非线性滤波--双边滤波:cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,dst=None,borderType=None)

d为像素的领域直径;sigmaColor为灰度值相似性高斯函数标准差;sigmaSpace为空间高斯函数标准差

双边滤波是结合图像的空间邻近度和像素值 相似度的一种折中处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部处理的特点。

简单起见,可以令2个sigma的值相等; 如果他们很小(小于10),那么滤波器几乎没有什么效果; 如果他们很大(大于150),那么滤波器的效果会很强,使图像显得非常卡通化; 关于参数d:

过大的滤波器(d>5)执行效率低。 对于实时应用,建议取d=5; 对于需要过滤严重噪声的离线应用,可取d=9; d>0时,由d指定邻域直径; d<=0时,d会自动由sigmaSpace的值确定,且d与sigmaSpace成正比;

blur = cv2.bilateralFilter(img,-1,15,10)

6.直方图均衡化:cv2.equalizeHist(src,dst=None)

直方图均衡化法的基本思想是对在像中素个数多灰度级进行展宽,而对像素点个数少的灰度级进行缩减。从而达到清晰图像的目的。

import cv2
import numpy as np
img = cv2.imread("./image/dark1.jpg")
cv2.imshow("src", img)
# 彩色图像均衡化,需要分解通道 对每一个通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一个通道
result = cv2.merge((bH, gH, rH))
cv2.imshow("dst", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

7.Gamma变换

Gamma变换使输出图像灰度值与输入图像灰度值呈指数变化,提升了暗部细节,可用来数据增强

import cv2
import numpy as np
img=cv2.imread('./image/dark1.jpg')
def adjust_gamma(image, gamma=1.0):
    invGamma = 1.0/gamma
    table = []
    for i in range(256):
        table.append(((i / 255.0) ** invGamma) * 255)
    table = np.array(table).astype("uint8")
    print(table)
    return cv2.LUT(image, table)

img_gamma = adjust_gamma(img, 0.8)
#print(img_gamma)
cv2.imshow("img",img)
cv2.imshow("img_gamma",img_gamma)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

你可能感兴趣的:(opencv,opencv,python)