高频:图像中变化剧烈的部分。
低频:图像灰度值变化缓慢、平坦的部分。
根据高低频,可以设置高通和低通滤波器。高通滤波器可以检测变化尖锐、明显的地方,用于边缘检测;低通可以让图像变得平滑,消除噪声,用于图像平滑去噪。
一、方框滤波
可以用于模糊一张图片。
涉及函数:
cv2.boxFilter()
参数说明:
- 参数1:输入图像
- 参数2:目标图像深度
- 参数3:核大小
- 参数4:normalize属性,true与均值滤波相同,false很容易发生溢出【所有元素相加结果值会超过255】。
import cv2
img = cv2.imread("beauty.png", cv2.IMREAD_UNCHANGED)
# -1表示默认,(3,3)可以调整模糊程度
r = cv2.boxFilter(img, -1, (3, 3), normalize=1)
d = cv2.boxFilter(img, -1, (3, 3), normalize=0)
# cv2.WINDOW_AUTOSIZE根据图像的大小自动调整窗口的大小
cv2.namedWindow("img",cv2.WINDOW_AUTOSIZE)
cv2.namedWindow("r",cv2.WINDOW_AUTOSIZE)
cv2.namedWindow("d",cv2.WINDOW_AUTOSIZE)
cv2.imshow('img',img)
cv2.imshow('r',r)
cv2.imshow('d',d)
cv2.waitKey(0)
cv2.destroyAllWindows()
二、均值滤波
取卷积核区域内元素的均值。
涉及函数:
cv2.blur()
参数说明:
- 参数1:输入原图
- 参数2:kernel的大小,一般是奇数
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("beauty.png", cv2.IMREAD_UNCHANGED)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
blur = cv2.blur(img, (3, 3))
plt.subplot(1, 2, 1), plt.imshow(img), plt.title('original')
plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(blur), plt.title("blurred")
plt.savefig("./beauty_blurred.jpg")
plt.xticks([]), plt.yticks([])
plt.show()
注意:方框滤波和均值滤波对全局进行模糊,对图像造成的破坏是比较大的。
三、高斯滤波
高斯滤波的卷积核权重并不相同,中间像素点权重最高,越远离中心的像素权重越低。(2维高斯函数)
高斯滤波相比均值滤波效率更慢,但是可以有效消除高斯噪声,能保留更多的图像细节,所以经常被称为最有用的滤波器。
涉及函数:
cv2.GaussianBlur()
参数说明:
- 参数1:原图像
- 参数2:高斯核大小
- 参数3:标准差。平滑时,调整标准差实际是在调整周围像素对当前像素的影响程度。调大标准差即提高了远处像素对中心像素的影响程度,滤波结果也就越平滑。
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("GaussianBlur.png", cv2.IMREAD_UNCHANGED)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
gauss = cv2.GaussianBlur(img,(3,3),7)
plt.subplot(1,2,1),plt.imshow(img),plt.title("original")
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(gauss),plt.title("gauss")
plt.xticks([]),plt.yticks([])
plt.show()
四、中值滤波
利用像素领域灰度值的中值代替该点的灰度值,中值滤波可以去除椒盐噪声和斑点噪声。
涉及函数:
cv2.medianBlur()
参数说明:
- 参数1:原图
- 参数2:核大小
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('medianBlur.png',cv2.IMREAD_UNCHANGED) # 原图含有椒盐噪声
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
media = cv2.medianBlur(img,5)
plt.subplot(1,2,1),plt.imshow(img),plt.title("original")
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(media),plt.title("media")
plt.xticks([]),plt.yticks([])
plt.show()
五、双边滤波
具有保边去噪的功能。
涉及函数:
bilateralFilter()
参数说明:
- 参数1:原图
- 参数2:像素的领域直径,d
- 参数3:灰度值相似性高斯函数标准差,sigma
- 参数4:空间高斯函数标准差,sigma
关于2个sigma参数:简单起见,可以令2个sigma的值相等; 如果他们很小(小于10),那么滤波器几乎没有什么效果; 如果他们很大(大于150),那么滤波器的效果会很强,使图像显得非常卡通化;
关于参数d:过大的滤波器(d>5)执行效率低。 对于实时应用,建议取d=5; 对于需要过滤严重噪声的离线应用,可取d=9; d>0时,由d指定邻域直径; d<=0时,d会自动由sigmaSpace的值确定,且d与sigmaSpace成正比。
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('dog.jpg',cv2.IMREAD_UNCHANGED)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
blur = cv2.bilateralFilter(img,-1,50,20)
plt.subplot(1,2,1),plt.imshow(img),plt.title('original')
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(blur),plt.title('blurred')
plt.xticks([]),plt.yticks([])
plt.show()
六、直方图均衡化
直方图均衡化是将原图像通过某种变换,得到一幅灰度直方图为均匀分布(近均匀分布)的新图像的方法。
主要思想是:将图像中像素个数多的灰度级进行展宽,像素个数少的灰度级进行缩减。
在一定程度上可以实现清晰图像的作用。
涉及函数:
cv2.equalizeHist()
参数说明:
参数1:待均衡化图像。
案列1:针对灰度图处理。
import cv2
img = cv2.imread("cat.jpg",0)
cv2.imshow("src", img)
cv2.waitKey(0)
img_equal = cv2.equalizeHist(img)
cv2.imshow("img_equal", img_equal)
cv2.waitKey(0)
cv2.destroyAllWindows()
案例2:针对彩色图像处理。
import cv2
img = cv2.imread("cat.jpg", 1)
cv2.imshow("src", img)
# 彩色图像均衡化,需要分解通道 对每一个通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
result = cv2.merge((bH, gH, rH))
cv2.imshow('res', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
总结:从上面可以看出,直方图均衡化可以将一张图从暗变亮。
七、Gamma变化
Gamma变换是对输入图像灰度值进行非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系。
Gamma变换用来图像增强,提升暗部细节。对漂白(相机曝光)或过暗(曝光不足)的图片,进行校正。让图像从曝光强度的线性响应变得更接近人眼感受的响应。
import cv2
import numpy as np
img = cv2.imread('cat.jpg')
def adjust_gamma(image, gamma=1.0):
invGamma = 1.0 / gamma
table = []
for i in range(256):
table.append(((i / 255.0) ** invGamma) * 255)
table = np.array(table).astype("uint8")
print(table)
return cv2.LUT(image, table)
# gamma大于0和小于1的时候图像会比原图更暗
# gamma大于1的时候,图像会比原图更亮
img_gamma = adjust_gamma(img, 0.8)
# print(img_gamma)
cv2.imshow("img", img)
cv2.imshow("img_gamma", img_gamma)
cv2.waitKey(0)
cv2.destroyAllWindows()
gamma=0.8
gamma=1.4