opencv-025-图像去噪声

知识点

图像去噪声在OCR、机器人视觉与机器视觉领域应用开发中是重要的图像预处理手段之一,对图像二值化与二值分析很有帮助,OpenCV中常见的图像去噪声的方法有

  • 均值去噪声
  • 高斯模糊去噪声
  • 非局部均值去噪声
  • 双边滤波去噪声
  • 形态学去噪声

代码(c++,python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

void add_gaussian_noise(Mat &image);

/*
* 图像去噪
*/
int main() {
Mat src = imread("../images/test.png");
Mat src_clone = src.clone();
if (src.empty()) {
cout << "could not load image.." << endl;
}
imshow("input", src);

// 产生高斯噪声
add_gaussian_noise(src);

Mat res1, res2, res3, res4;
// 均值去噪
blur(src, res1, Size(3, 3));
imshow("mean_blur", res1);

// 高斯去噪
GaussianBlur(src, res2, Size(5, 5), 0);
imshow("gaussian_blur", res2);

// 中值去噪
medianBlur(src, res3, 3);
imshow("median_blur", res3);

// 非局部均值去噪
fastNlMeansDenoisingColored(src, res4, 15151030);
imshow("NLmeans_blur", res4);

waitKey(0);
return 0;
}

void add_gaussian_noise(Mat &image) {
Mat noise = Mat::zeros(image.size(), image.type());
// 产生高斯噪声
randn(noise, (15, 15, 15), (30, 30, 30));
Mat dst;
add(image, noise, dst);
imshow("gaussian_noise", dst);
dst.copyTo(image);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import cv2 as cv
import numpy as np

def gaussian_noise(image):
noise = np.zeros(image.shape, image.dtype)
m = (15, 15, 15)
s = (30, 30, 30)
cv.randn(noise, m, s)
dst = cv.add(image, noise)
cv.imshow("gaussian noise", dst)
return dst


src = cv.imread("D:\\code-workspace\\Clion-workspace\\learnOpencv\\images\\test.png")
cv.imshow("input", src)
h, w = src.shape[:2]
src = gaussian_noise(src)

result1 = cv.blur(src, (5, 5))
cv.imshow("mean_blur", result1)

result2 = cv.GaussianBlur(src, (5, 5), 0)
cv.imshow("gaussian_blur", result2)

result3 = cv.medianBlur(src, 5)
cv.imshow("median_blur", result3)

result4 = cv.fastNlMeansDenoisingColored(src, None, 15, 15, 10, 30)
cv.imshow("NLmeans_blur", result4)

cv.waitKey(0)
cv.destroyAllWindows()

结果

代码地址

github