OpenCV Python 平滑去噪
【目标】
- 利用不同的低通滤波器对图像进行平滑去噪(平均、高斯、中值、双边)
- 使用自己定制的滤波器
- 5x5 平均滤波器
K = 1 25 [ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ] K= \frac{1}{25} \begin{bmatrix} 1 & 1 & 1 & 1 & 1\\ 1 & 1 & 1 & 1 & 1\\ 1 & 1 & 1 & 1 & 1\\ 1 & 1 & 1 & 1 & 1\\ 1 & 1 & 1 & 1 & 1 \end{bmatrix} K=251⎣⎢⎢⎢⎢⎡1111111111111111111111111⎦⎥⎥⎥⎥⎤
- 3x3 平均滤波器
K = 1 9 [ 1 1 1 1 1 1 1 1 1 ] K= \frac{1}{9} \begin{bmatrix} 1 & 1 & 1\\ 1 & 1 & 1\\ 1 & 1 & 1 \end{bmatrix} K=91⎣⎡111111111⎦⎤
【代码】
- 自定义平滑滤波器
import numpy as np
import cv2
img = cv2.imread('opencv-logo-white.png')
kernel = np.ones((5, 5), np.float32)/25
dst = cv2.filter2D(img, -1, kernel)
cv2.imshow("src", img)
cv2.imshow("filter2D", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 模糊
import cv2
import numpy as np
img = cv2.imread('opencv-logo-white.png')
blur = cv2.blur(img,(5,5))
cv2.imshow("src", img)
cv2.imshow("blur", blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 高斯模糊
import cv2
import numpy as np
img = cv2.imread('opencv-logo-white.png')
blur = cv2.GaussianBlur(img, (5, 5), 0)
cv2.imshow("src", img)
cv2.imshow("GaussianBlur", blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 中值滤波
import numpy as np
import cv2
def addPepperSalt(src: cv2.Mat, snr: float = 0.99) -> cv2.Mat:
"""
addPepperSalt 给彩色图像添加黑白椒盐噪声
_extended_summary_
Args:
src (cv2.Mat): 输入图像
snr (float): 信噪比
"""
if src is None:
return None
dst = src.copy()
h, w, _ = src.shape
imgsz = h * w
pepperSaltNum = int(imgsz * (1.0 - snr))
for i in range(pepperSaltNum):
randx = np.random.randint(1, w-1)
randy = np.random.randint(1, h-1)
if np.random.random() <= 0.5:
dst[randy, randx] = 0
else:
dst[randy, randx] = 255
return dst
img = cv2.imread('sheets.png')
cv2.imshow("src", img)
pepperSaltIm = addPepperSalt(img, 0.99)
cv2.imshow("peppersalt", pepperSaltIm)
median = cv2.medianBlur(pepperSaltIm, 5)
blur = cv2.bilateralFilter(pepperSaltIm, 15, 180, 180)
cv2.imshow("median", median)
cv2.imshow("blur", blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 双边滤波
import cv2
import numpy as np
img = cv2.imread('bilateral.png')
blur = cv2.bilateralFilter(img,9,75,75)
cv2.imshow("src", img)
cv2.imshow("bilateralFilter", blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
【接口】
- cv2.filter2D
void cv::filter2D ( InputArray src,
OutputArray dst,
int ddepth,
InputArray kernel,
Point anchor = Point(-1,-1),
double delta = 0,
int borderType = BORDER_DEFAULT
);
cv2.filter2D( src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]] ) -> dst
ddepth:
borderType:
- cv2.blur
void cv::blur ( InputArray src,
OutputArray dst,
Size ksize,
Point anchor = Point(-1,-1),
int borderType = BORDER_DEFAULT
);
cv2.blur( src, ksize[, dst[, anchor[, borderType]]] ) -> dst
- cv2.boxFilter
void cv::boxFilter ( InputArray src,
OutputArray dst,
int ddepth,
Size ksize,
Point anchor = Point(-1,-1),
bool normalize = true,
int borderType = BORDER_DEFAULT
);
cv2.boxFilter( src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]] ) -> dst
- cv2.GaussianBlur
void cv::GaussianBlur ( InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY = 0,
int borderType = BORDER_DEFAULT
);
cv2.GaussianBlur( src, ksize, sigmaX[, dst[, sigmaY[, borderType]]] ) -> dst
- cv2.bilateralFilter
void cv::bilateralFilter ( InputArray src,
OutputArray dst,
int d,
double sigmaColor,
double sigmaSpace,
int borderType = BORDER_DEFAULT
);
cv2.bilateralFilter( src, d, sigmaColor, sigmaSpace[, dst[, borderType]] ) -> dst
【参考】
- OpenCV 官方文档
- 双边滤波的介绍与应用