【OpenCV】10 图像滤波

作用

将一幅图像通过滤波器转换为另一幅图像。
滤波器又称为卷积核,滤波过程称为卷积。

卷积核

卷积核一般为奇数,如 3x3 5x5 7x7

为什么取奇数?

  1. 增加padding
  2. 保证锚点在中间,防止图像偏移

大小的影响?

在深度学习中,卷积核越大,看到的信息(感受野)越多,提取的特征就越好,计算量就越大。

锚点

卷积核的中心

边界扩充

当卷积核 > 1 且不进行边界扩充,输出尺寸将相应缩小。
当卷积核以标准方式进行边界扩充,则输出数据的空间尺寸将与输入相等。
image

计算公式

输出图像大小N= ( 输入图像尺寸W - 卷积核大小F + 2 x 扩充尺寸P ) / 步长大小S + 1
步长大小默认为1

图像卷积

低通滤波和高通滤波

低通滤波:低于某个阀值的值可以通过。去除噪音和平滑图像。
高通滤波:高于某个阀值的值可以通过。查找图像边缘。

示例

image

import cv2
import numpy as np

img = cv2.imread('img/cat.jpg')

kernel = np.ones((5, 5), np.float32) / 25

dst = cv2.filter2D(img, -1, kernel)

cv2.imshow('dst', dst)
cv2.imshow('img', img)
cv2.waitKey(0)

低通滤波

方盒滤波 boxFilter

image

当 normalize == true,a = 1 / (W x H) ,退化为均值滤波
当 normalize == false,a = 1

均值滤波 blur

image

import cv2
import numpy as np

img = cv2.imread('img/cat.jpg')

dst = cv2.blur(img, (5, 5))

cv2.imshow('dst', dst)
cv2.imshow('img', img)
cv2.waitKey(0)

高斯滤波 GaussianBlur

可以有效解决高斯噪点。
image

import cv2
import numpy as np

img = cv2.imread('img/cat.jpg')

dst = cv2.GaussianBlur(img, ksize=(5, 5), sigmaX=100)

cv2.imshow('dst', dst)
cv2.imshow('img', img)
cv2.waitKey(0)

中值滤波

可以有效解决胡椒噪点。
image

import cv2
import numpy as np

img = cv2.imread('img/cat.jpg')

dst = cv2.medianBlur(img, 5)

cv2.imshow('dst', dst)
cv2.imshow('img', img)
cv2.waitKey(0)

双边滤波

可以保留边缘,同时对边缘内的区域进行平滑处理。
主要作用是:美颜
image

image

import cv2
import numpy as np

img = cv2.imread('img/cat.jpg')

dst = cv2.bilateralFilter(img, 7, 20, 50)

cv2.imshow('dst', dst)
cv2.imshow('img', img)
cv2.waitKey(0)

高通滤波

Sobel算子

  • 先向x方向求导
  • 再向y方向求导
  • 最终结果:|G| = |Gx| + |Gy|
    kernelsize设为-1时退化为Scharr
    image
import cv2
import numpy as np

img = cv2.imread('img/chess.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, dst = cv2.threshold(gray, 210, 255, cv2.THRESH_BINARY)
img = cv2.convertScaleAbs(dst)  # 转换为绝对值并转为uint8

dst_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
dst_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
dst = dst_x + dst_y

cv2.imshow('dst_x', dst_x)
cv2.imshow('dst_y', dst_y)
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)

Scharr算子

  • 与Sobel类似,只不过使用的kernel值不同
  • Scharr只能求x方向或y方向的边缘

Laplacian算子

  • 可以同时求2个方向的边缘
  • 对噪音敏感,一般需要先进行去噪
    image
import cv2
import numpy as np

img = cv2.imread('img/chess.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, dst = cv2.threshold(gray, 210, 255, cv2.THRESH_BINARY)
img = cv2.convertScaleAbs(dst)  # 转换为绝对值并转为uint8

dst = cv2.Laplacian(img, cv2.CV_64F, ksize=5)

cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)

边缘检测 Canny

1.高斯滤波降噪,使用5x5高斯滤波器。
2.在0度、45度、90度、135度四个方向上进行梯度计算。
3.取四个方向上的局部最大值,认为最大值对应的边缘最佳。
4.进行阈值计算,超过最大值的为边缘,低于最小值的非边缘,介于之间的根据连贯性判断。
image

import cv2
import numpy as np

img = cv2.imread('img/cat.jpg')

dst = cv2.Canny(img, 100, 150)

cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
posted @ 2025-09-22 14:02  苦涩如影相随固  阅读(45)  评论(0)    收藏  举报