平滑滤波器的用途:
1.对大图像处理前,删去无用的细小细节
2.连接中断的线段和曲线
3.降低噪音
4.平滑处理,恢复过分锐化的图像
5.图像创艺(阴影、软边、朦胧效果)
平滑滤波器的设计可以自行调整,主要就是关注滤波器的大小和滤波器的系数。
这里我使用椒盐噪声,先生成含有含有椒盐噪声的图像。
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import random
def sp_noise(image,prob):
'''
添加椒盐噪声
prob:噪声比例
'''
output = np.zeros(image.shape,np.uint8)
thres = 1 - prob
for i in range(image.shape[0]):
for j in range(image.shape[1]):
rdn = random.random()
if rdn < prob:
output[i][j] = 0
elif rdn > thres:
output[i][j] = 255
else:
output[i][j] = image[i][j]
return output
img = cv.imread("pictures/cat.jpg", 0)
img_noise = sp_noise(img, 0.005)
plt.subplot(1, 2, 1), plt.imshow(img, 'gray'), plt.title("img"), plt.xticks(
[]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(img_noise, 'gray'), plt.title("img_noise"), plt.xticks(
[]), plt.yticks([])
plt.show()
可以看到椒盐噪声也就是将图像上的某些像素点变成黑白像素,从而达到添加噪声的目的。
平均滤波
将滤波器滑动到的范围中的所有像素值加起来求出平均值替代中心像素值。
例如一个3x3的均值滤波器是这样:
这里采用3x3和5x5的均值滤波器分别处理刚刚生成的椒盐噪声图像,对比看看结果:
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import random
def sp_noise(image, prob):
'''
添加椒盐噪声
prob:噪声比例
'''
output = np.zeros(image.shape, np.uint8)
thres = 1 - prob
for i in range(image.shape[0]):
for j in range(image.shape[1]):
rdn = random.random()
if rdn < prob:
output[i][j] = 0
elif rdn > thres:
output[i][j] = 255
else:
output[i][j] = image[i][j]
return output
img = cv.imread("pictures/cat.jpg", 0)
img_noise = sp_noise(img, 0.005)
plt.subplot(2, 2, 1), plt.imshow(img, 'gray'), plt.title("img"), plt.xticks(
[]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(
img_noise, 'gray'), plt.title("img_noise"), plt.xticks([]), plt.yticks([])
img_aver_3x3 = cv.blur(img_noise, (3, 3))
plt.subplot(2, 2, 3), plt.imshow(
img_aver_3x3,
'gray'), plt.title("img_aver_3x3"), plt.xticks([]), plt.yticks([])
img_aver_5x5 = cv.blur(img_noise, (5, 5))
plt.subplot(2, 2, 4), plt.imshow(
img_aver_5x5,
'gray'), plt.title("img_aver_5x5"), plt.xticks([]), plt.yticks([])
plt.show()
中值滤波
中值滤波算法的实现:
将模板区域内的像素排序,求出中值,例如3x3的模板,第5大是中值;5x5的模板,第13大是中值,以此类推。
通过滤波器的滑动,每到一个区域,取中值替代原来的像素。
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import random
def sp_noise(image, prob):
'''
添加椒盐噪声
prob:噪声比例
'''
output = np.zeros(image.shape, np.uint8)
thres = 1 - prob
for i in range(image.shape[0]):
for j in range(image.shape[1]):
rdn = random.random()
if rdn < prob:
output[i][j] = 0
elif rdn > thres:
output[i][j] = 255
else:
output[i][j] = image[i][j]
return output
img = cv.imread("pictures/cat.jpg", 0)
img_noise = sp_noise(img, 0.005)
plt.subplot(2, 2, 1), plt.imshow(img, 'gray'), plt.title("img"), plt.xticks(
[]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(
img_noise, 'gray'), plt.title("img_noise"), plt.xticks([]), plt.yticks([])
img_med_3x3 = cv.medianBlur(img_noise, 3)
plt.subplot(2, 2, 3), plt.imshow(
img_med_3x3,
'gray'), plt.title("img_med_3x3"), plt.xticks([]), plt.yticks([])
img_med_5x5 = cv.medianBlur(img_noise, 5)
plt.subplot(2, 2, 4), plt.imshow(
img_med_5x5,
'gray'), plt.title("img_med_5x5"), plt.xticks([]), plt.yticks([])
plt.show()
锐化滤波器的作用:
1.加强图像中景物的边缘和轮廓
2.印刷中的细微层次强调,弥补扫描,挂网对图像的平滑
3.超声探测成像,分辨率低,边缘模糊,通过锐化来改善
4.图像识别中分割前的边缘提取
5.锐化处理恢复过度平滑、曝光不足的图像
6.图像创艺(只剩下边界的特殊图像)
7.尖端武器的目标识别、定位
锐化滤波器是设计:
1.中心系数为正值,外围为负值
2.系数之和为0
一阶微分算子:Sobel算子
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import random
img = cv.imread("pictures/lena.jpg", 0)
plt.subplot(2, 2, 1), plt.imshow(img, 'gray'), plt.title("img"), plt.xticks(
[]), plt.yticks([])
# X方向用sobel算子进行锐化
img_sobel_x = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=3)
# Y方向用sobel算子进行锐化
img_sobel_y = cv.Sobel(img, cv.CV_64F, 0, 1, ksize=3)
# 格式转换
img_sobel_x = cv.convertScaleAbs(img_sobel_x)
img_sobel_y = cv.convertScaleAbs(img_sobel_y)
# 最后一个参数是偏置 这里我取0
img_sobel = cv.addWeighted(img_sobel_x, 0.5, img_sobel_y, 0.5, 0)
plt.subplot(2, 2, 2), plt.imshow(
img_sobel, 'gray'), plt.title("img_sobel"), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(img_sobel_x,
'gray'), plt.title("img_sobel_x"), plt.xticks(
[]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(img_sobel_y,
'gray'), plt.title("img_sobel_y"), plt.xticks(
[]), plt.yticks([])
plt.show()
先分别计算x和y方向经过Sobel算子处理过的图像,然后以相同的权重加在一起。
二阶微分算子:拉普拉斯算子
拉普拉斯算子模板以及扩展模板:
锐化模板特点:模板内系数有正有负,表示差分运算。
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import random
img = cv.imread("pictures/lena.jpg", 0)
plt.subplot(1, 2, 1), plt.imshow(img, 'gray'), plt.title("img"), plt.xticks(
[]), plt.yticks([])
img_laplacian = cv.Laplacian(img, cv.CV_64F)
img_laplacian = cv.convertScaleAbs(img_laplacian)
plt.subplot(1, 2, 2), plt.imshow(
img_laplacian,
'gray'), plt.title("img_laplacian"), plt.xticks([]), plt.yticks([])
plt.show()