图像也可以像电信号一样, 进行滤波处理。低通滤波(LPF)可以帮助我们去除噪音,模糊图像, 高通滤波(HPF)可以帮我们找到图像的边缘。
1, filter2D(src, ddepth, kernel, dst=None, anchor=None, delta=None, borderType=None)
参数 | 含义 |
---|---|
src | 输入图像 |
ddepth | -1 表示与原图一致 |
kernel | 滤波器核 |
dst | |
anchor | 内核的基准点(anchor),其默认值为(-1,-1)说明位于kernel的中心位置。基准点即kernel中与进行处理的像素点重合的点。 |
delta | 在储存目标图像前可选的添加到像素的值,默认值为0 |
borderType | 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。 |
构建一个5X5的平均滤波器核, 将核放在像素A上, 求像素周边的像素和,再去平均值来代替像素A。重复直到图像的所有像素都计算过一边为止
A = \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}
# coding:utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
def show(imgs, titles):
j = 121
for i in range(len(imgs)):
plt.subplot(j), plt.imshow(imgs[i]), plt.title(titles[i])
plt.xticks([]), plt.yticks([])
j = j +1
plt.show()
if __name__ == '__main__':
img = cv2.imread('./001_720x1080.jpg', cv2.IMREAD_UNCHANGED)
kernel = np.ones((5,5), np.float32)/25
out= cv2.filter2D(img, -1, kernel)
show([cv2.cvtColor(img, cv2.COLOR_BGR2RGB), cv2.cvtColor(out, cv2.COLOR_BGR2RGB)],['original', 'filter2D'])
2, 图像模糊(图像平滑)
opencv提供了4中模糊技术
2.1 平均
使用了归一化卷积框完成的, 使用卷积框内的所有像素的平均值来代替中心像素可以使用cv2.blur和cv2.boxFilter()来完成
# coding:utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
def show(imgs, titles):
j = 121
for i in range(len(imgs)):
plt.subplot(j), plt.imshow(imgs[i]), plt.title(titles[i])
plt.xticks([]), plt.yticks([])
j = j +1
plt.show()
if __name__ == '__main__':
img = cv2.imread('./001_720x1080.jpg', cv2.IMREAD_UNCHANGED)
out = cv2.blur(img, (5, 5))
show([cv2.cvtColor(img, cv2.COLOR_BGR2RGB), cv2.cvtColor(out, cv2.COLOR_BGR2RGB)],['original', 'blur'])
cv2.blur(src, ksize, dst=None, anchor=None, borderType=None)
参数 | 含义 |
---|---|
src | 输入图像 |
ksize | 卷积核的大小 |
dst | |
anchor | 内核的基准点(anchor),其默认值为(-1,-1)说明位于kernel的中心位置。基准点即kernel中与进行处理的像素点重合的点。 |
borderType | 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。 |
2.2 高斯模糊
高斯模糊能有效去除高斯噪音。
把卷积核换成高斯核, 中心点越往外, 对中心点的影响越小。 可以直接使用cv2.GaussianBlur方法, 也可以用cv2.getGaussianKernel() 自己构建个高斯核。
# coding:utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
def show(imgs, titles):
j = 121
for i in range(len(imgs)):
plt.subplot(j), plt.imshow(imgs[i]), plt.title(titles[i])
plt.xticks([]), plt.yticks([])
j = j +1
plt.show()
if __name__ == '__main__':
img = cv2.imread('./001_720x1080.jpg', cv2.IMREAD_UNCHANGED)
out = cv2.GaussianBlur(img, (5, 5), 0)
show([cv2.cvtColor(img, cv2.COLOR_BGR2RGB), cv2.cvtColor(out, cv2.COLOR_BGR2RGB)],['original', 'blur'])
GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
参数 | 含义 |
---|---|
src | 输入图像 |
ksize | 卷积核大小 (必须为奇数) |
sigmaX | 标准差 |
dst | |
sigmaY | |
borderType | 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。 |
2.3 中值模糊
这个滤波器经常用来去出椒盐噪声。
是用与卷积框对应像素的中值来替代中心像素的值。
# coding:utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
def show(imgs, titles):
j = 121
for i in range(len(imgs)):
plt.subplot(j), plt.imshow(imgs[i]), plt.title(titles[i])
plt.xticks([]), plt.yticks([])
j = j +1
plt.show()
if __name__ == '__main__':
img = cv2.imread('./001_720x1080.jpg', cv2.IMREAD_UNCHANGED)
out = cv2.medianBlur(img, 5)
show([cv2.cvtColor(img, cv2.COLOR_BGR2RGB), cv2.cvtColor(out, cv2.COLOR_BGR2RGB)],['original', 'blur'])
medianBlur(src, ksize, dst=None)
参数 | 含义 |
---|---|
src | 输入图像 |
ksize | 卷积核的大小 |
dst |
2.4 双边滤波
能在保持边界清晰的情况下有效的去出噪音。但是这种操作与其他滤波器相比会比较慢。双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函 数确保只有邻近区域的像素对中心点有影响, 灰度值相似性高斯函数确保只有 与中心像素灰度值相似的才会用来做模糊计算。所以这种方法会确保边界不 会模糊掉, 因为边界处的灰度值变化比较大。
# coding:utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
def show(imgs, titles):
j = 121
for i in range(len(imgs)):
plt.subplot(j), plt.imshow(imgs[i]), plt.title(titles[i])
plt.xticks([]), plt.yticks([])
j = j +1
plt.show()
if __name__ == '__main__':
img = cv2.imread('./001_720x1080.jpg', cv2.IMREAD_UNCHANGED)
out = cv2.bilateralFilter(img, 19,5, 5)
show([cv2.cvtColor(img, cv2.COLOR_BGR2RGB), cv2.cvtColor(out, cv2.COLOR_BGR2RGB)],['original', 'bilateralFilter'])
bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
参数 | 含义 |
---|---|
src | 输入图像 |
d | 邻域直径 |
sigmaColor | 灰度值高斯函数标准差 |
sigmaSpace | 空间高斯函数标准差 |
dst | |
borderType |