作用
将一幅图像通过滤波器转换为另一幅图像。
滤波器又称为卷积核,滤波过程称为卷积。
卷积核
卷积核一般为奇数,如 3x3 5x5 7x7
为什么取奇数?
- 增加padding
- 保证锚点在中间,防止图像偏移
大小的影响?
在深度学习中,卷积核越大,看到的信息(感受野)越多,提取的特征就越好,计算量就越大。
锚点
卷积核的中心
边界扩充
当卷积核 > 1 且不进行边界扩充,输出尺寸将相应缩小。
当卷积核以标准方式进行边界扩充,则输出数据的空间尺寸将与输入相等。
计算公式
输出图像大小N= ( 输入图像尺寸W - 卷积核大小F + 2 x 扩充尺寸P ) / 步长大小S + 1
步长大小默认为1
图像卷积
低通滤波和高通滤波
低通滤波:低于某个阀值的值可以通过。去除噪音和平滑图像。
高通滤波:高于某个阀值的值可以通过。查找图像边缘。
示例
import cv2
import numpy as npimg = cv2.imread('img/cat.jpg')kernel = np.ones((5, 5), np.float32) / 25dst = cv2.filter2D(img, -1, kernel)cv2.imshow('dst', dst)
cv2.imshow('img', img)
cv2.waitKey(0)
低通滤波
方盒滤波 boxFilter
当 normalize == true,a = 1 / (W x H) ,退化为均值滤波
当 normalize == false,a = 1
均值滤波 blur
import cv2
import numpy as npimg = cv2.imread('img/cat.jpg')dst = cv2.blur(img, (5, 5))cv2.imshow('dst', dst)
cv2.imshow('img', img)
cv2.waitKey(0)
高斯滤波 GaussianBlur
可以有效解决高斯噪点。
import cv2
import numpy as npimg = 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)
中值滤波
可以有效解决胡椒噪点。
import cv2
import numpy as npimg = cv2.imread('img/cat.jpg')dst = cv2.medianBlur(img, 5)cv2.imshow('dst', dst)
cv2.imshow('img', img)
cv2.waitKey(0)
双边滤波
可以保留边缘,同时对边缘内的区域进行平滑处理。
主要作用是:美颜
import cv2
import numpy as npimg = 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
import cv2
import numpy as npimg = 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) # 转换为绝对值并转为uint8dst_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_ycv2.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个方向的边缘
- 对噪音敏感,一般需要先进行去噪
import cv2
import numpy as npimg = 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) # 转换为绝对值并转为uint8dst = 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.进行阈值计算,超过最大值的为边缘,低于最小值的非边缘,介于之间的根据连贯性判断。
import cv2
import numpy as npimg = cv2.imread('img/cat.jpg')dst = cv2.Canny(img, 100, 150)cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)