降噪后出现边缘“毛刺”问题

中值滤波

使用opencv中的medianBlur解决方案:

1
medianBlur_new_img = cv.medianBlur(new_img, 3)

可以优化之前的降噪效果:

image-20210808221052012

效果几乎达到理想状态(只有四周边界有些许噪声残留)

探究中值滤波起了多大作用

尝试直接使用中值滤波对噪声图进行降噪:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# python3.8
# utf-8
import cv2 as cv


def main(address):
img = cv.imread(address, 1)
new_img = cv.medianBlur(img, 3)
cv.imwrite('denoised_' + address, new_img)


if __name__ == '__main__':
img_address = 'img_noise.png'
main(img_address)

得到结果:

denoised_img_noise

虽然效果略微比上面差一点,但是几乎接近。

那么从这个结果看,可以看出中值滤波的算法非常优秀,虽然这无法证明中值滤波在上面试验中起到了多大作用,但也说明了我的方法效果还是欠缺的。

增加噪声

将噪声增加到8000个,也就是20%的噪声:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cv2 as cv
import numpy as np
import random

img = cv.imread("img.png", 1)
(rows, cols, chn) = img.shape
cv.imshow("img.png", img)

# 加噪声
for i in range(8000):
x = np.random.randint(0, rows)
y = np.random.randint(0, cols)
img[x, y, :] = random.randint(0, 255)


cv.imshow("noise", img)
cv.imwrite("img_noise.png", img)
cv.waitKey()
cv.destroyAllWindows()

image-20210808222119047

中值滤波

直接使用中值滤波,得到:

denoised_img_noise

这次得到的结果就并不理想了

我的方法 + 中值滤波

得到:

image-20210808222523752

结果优于直接使用中值滤波,在不放大的情况下,肉眼不太看得出噪声,放大之后,发现边缘部分仍有极少量“毛刺”,且边缘界限变得模糊。对于肉眼观察来说,图像变得柔和;对于寻找边缘来说,变得不明确。