본문 바로가기

Computer Vision by OpenCV

OpenCV 잡음, Salt & Pepper Noise 추가하기

반응형
SMALL


Salt and Pepper Noise 추가하기


영상잡음의 다른 종류로 salt and pepper noise라는 것이 있다. 

이것은 Gaussian noise와 달리 잡음이 주변 픽셀들과 색깔이 확연히 다르다.

마치 사진 위에 소금과 후추를 떨어뜨려 놓은 것 처럼 보인다고 해서 salt & pepper noise라고 한다.


아래 사진에 salt and pepper noise를 추가해보자 한다.

전체 픽셀중에 약 5%를 무작위로 골라서 해당 위치를 noise로 바꾸는 것이다. 

결과는 아래 사진과 같다.


위 이미지 결과를 만들어내기 위한 소스코드는 아래와 같다.


 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
53
54
55
56
57
58
59
60
61
62
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

/*
   img의 전체 픽셀중 noise_ratio 퍼센트 만큼의
   픽셀을 salt & pepper noise로 바꾼다.
*/
void addSaltAndPepperNoise(Mat& img, double noise_ratio)
{
	int rows = img.rows;
	int cols = img.cols;
	int ch = img.channels();
	int num_of_noise_pixels = (int)((double)(rows * cols * ch)*noise_ratio);
	
	for (int i = 0; i < num_of_noise_pixels; i++)
	{
		int r = rand() % rows;  // noise로 바꿀 행을 임의로 선택
		int c = rand() % cols;  // noise로 바꿀 열을 임의로 선택
		int _ch = rand() % ch;  // noise로 바꿀 채널의 임의로 선택

		// img.ptr<uchar>(r)은 r번째 행의 첫번째 픽셀, 첫번째 채널에 대한 주소값을 반환한다.
		uchar* pixel = img.ptr<uchar>(r) +(c*ch) + _ch; // noise로 바꿀 정확한 위치를 계산

		*pixel = (rand() % 2 == 1) ? 255 : 0; // black(0) 혹은 white(255)로 교체
	}
}

int main(int argc, char** argv)
{

	if (argc != 2)
	{
		cout << " Provide image name to read" << endl;
		return -1;
	}

	Mat inputImg;
	Mat spImg;

	inputImg = imread(argv[1], CV_LOAD_IMAGE_COLOR);
	resize(inputImg, inputImg, Size(), 0.3, 0.3, CV_INTER_AREA);

	spImg = inputImg.clone();
	addSaltAndPepperNoise(spImg, 0.05);

	namedWindow("Original", CV_WINDOW_AUTOSIZE);
	namedWindow("SaltAndPepper", CV_WINDOW_AUTOSIZE);


	moveWindow("Original", 100, 100);
	moveWindow("SaltAndPepper", 120, 120);


	imshow("Original", inputImg);
	imshow("SaltAndPepper", spImg);

	waitKey(0);
	return 0;
}


반응형
LIST