图像平滑处理的基本原理是,将噪声所在像素点的像素值处理为其周围临近像素点的值得近似值。取近似值得方式很多,本章主要介绍:
- 均值滤波
- 方框滤波
- 高斯滤波
- 中值滤波
- 双边滤波
- 2D卷积也成自定义卷积
第一,均值滤波
import cv2
img = cv2.imread('../data/1.jpg', 1)
f = cv2.blur(img, (3, 3))
cv2.imshow('img', img)
cv2.imshow('f', f)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.imwrite('../data/blur.jpg', f)
第二,方框滤波,实现归一化的方框滤波相当于均值滤波
import cv2
img = cv2.imread('../data/1.jpg', 1)
f = cv2.boxFilter(img, -1, (3, 3), normalize=0) # -1表示处理之后的图片深度跟原图片相同
cv2.imshow('img', img)
cv2.imshow('f', f)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.imwrite('../data/blur.jpg', f)
第三,高斯滤波可以模糊图片边缘信息
import cv2
img = cv2.imread('../data/1.jpg', 1)
f = cv2.GaussianBlur(img, (3, 3), 0, 0)
# 后面两个0表示高斯滤波的权重的标准差根据卷积核的大小来决定(默认卷积核为5计算出来的标准差为1.1)
# 卷积核越大,噪音去除效果会越好,照片会越模糊
cv2.imshow('img', img)
cv2.imshow('f', f)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.imwrite('../data/blur.jpg', f)
第四,中值滤波
import cv2
img = cv2.imread('../data/1.jpg', 1)
f = cv2.medianBlur(img, 3)
cv2.imshow('img', img)
cv2.imshow('f', f)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.imwrite('../data/blur.jpg', f)
第五,双边滤波有助于保留图像边界信息,但是去除噪声的效果并不好
import cv2
img = cv2.imread('../data/1.jpg', 1)
f = cv2.bilateralFilter(img, 5, 50, 100)
# 第二个参数表示以当前像素点为中心点的直径
# 第三个参数表示滤波处理时选取的颜色差值范围,该值决定了周围那些像素点能够参与到滤波中来
# 第四个参数它的值越大,说明有越多的点能够参与到该滤波计算中来
cv2.imshow('img', img)
cv2.imshow('f', f)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.imwrite('../data/blur.jpg', f)
双边滤波处理前
处理之后
第六,2D卷积也称自定义卷积
对于图像处理的大神来说,也不是很好搞清楚卷积的真正内含,从某种程度而言,卷积操作是个黑盒子
而不同的卷积核只是它的参数而已,出来的效果谁都无法用理论证明,只要多试几次,然后总结出
相对于好的效果进行实际效果的应用
import cv2
import numpy as np
kernel = np.ones((5, 5), np.float32) / 81 # 在这里自定义卷积核
img = cv2.imread('../data/1.jpg', 1)
f = cv2.filter2D(img, -1, kernel)
cv2.imshow('img', img)
cv2.imshow('f', f)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.imwrite('../data/blur.jpg', f)