0
点赞
收藏
分享

微信扫一扫

【OpenCV-Python】教程:3-4 平滑去噪,高斯平滑,均值滤波,中值滤波

凶猛的小白兔 2022-11-22 阅读 26
opencvpython

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=2511111111111111111111111111

  • 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=91111111111

【代码】

  • 自定义平滑滤波器

在这里插入图片描述

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

【参考】

  1. OpenCV 官方文档
  2. 双边滤波的介绍与应用
举报

相关推荐

0 条评论