OpenCV:线性滤波(方框滤波、均值滤波、高斯滤波)、非线性滤波(中值滤波、双边滤波)
import cv2
'''线性滤波'''
def box(img, k):
img_P_0 = cv2.boxFilter(img, -1, k, normalize=0)
img_P_1 = cv2.boxFilter(img, -1, k, normalize=1)
'''cv2.boxFilter(src, depth, ksize, normalize)
src:输入图像
depth:图片深度(设置-1为默认深度,不自行设定)
ksize:卷积核大小(默认3*3),越大越模糊,也可当去噪用
normalize:0为False,1为True。0:卷积核内像素求和,1:求平均值
'''
cv2.imshow('方框滤波0', img_P_0)
cv2.imshow('方框滤波1', img_P_1)
def mean(img, k):
img_M = cv2.blur(img, k)
'''cv2.blur(scr, ksize)
src:输入图像
ksize:卷积核大小(默认3*3),一般为奇数
'''
cv2.imshow('均值滤波', img_M) #相当于方框滤波 normalize参数为1
def gauss(img, k, a):
img_G = cv2.GaussianBlur(img, k, a)
'''cv2.GaussianBlur(src, ksize, sigma)
src:输入图像
ksize:高斯核大小(默认3*3),一般为奇数
sigma:高斯权重,值越大,远处像素对中心点的影响越大
'''
cv2.imshow('高斯滤波', img_G)
'''非线性滤波'''
def median(img, k):
img_M = cv2.medianBlur(img, k)
'''cv2.medianBlur(src, ksize, dst)
src:输入图像
ksize:核大小,方阵,输1位
'''
cv2.imshow('中值滤波', img_M)
def bilateral(img, d, c, s):
img_B = cv2.bilateralFilter(img, d, c, s) #保留图像边缘进行去噪
'''cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
src:输入图像
d:像素邻域直径(-1即可)
sigmaColor:灰度值相似性高斯函数标准差
sigmaSpace:空间高斯函数标准差
'''
cv2.imshow('双边滤波', img_B)
img_0 = cv2.imread('识别(原).png', cv2.IMREAD_UNCHANGED)
img_1 = cv2.imread('识别(椒盐).png', cv2.IMREAD_UNCHANGED)
img_0 = cv2.resize(img_0, (450,400))
img_1 = cv2.resize(img_1, (450,400))
cv2.imshow('原图', img_0)
cv2.imshow('椒盐噪声图', img_1)
box(img_1, (6, 2))
mean(img_1, (5, 5))
gauss(img_1, (3, 3), 1)
median(img_1, 3)
bilateral(img_1, -1, 20, 15)
cv2.waitKey(0)
cv2.destroyAllWindows()
https://www.bilibili.com/video/BV1Vt4y147Pp/?spm_id_from=333.788&vd_source=b89ce2a9b55dab86caa0ee60b66c9f86