잡음이 있는 이미지 생성하기 (가우시안 잡음)
가우시안 잡음 : 가우시안 밀도 함수를 갖는 잡음
c++)
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 63 64 65 66 67 68 69 | #include <opencv/cv.h> #include <opencv/highgui.h> #include <time.h> IplImage* GaussianNoiseCreate(IplImage *img, int std); void main() { IplImage *srcImage = cvLoadImage("D:/study/testimage.jpg", -1); //가우시안 잡음 이미지 생성 //가우시안 잡음 : 가우시안 밀도 함수를 갖는 잡음 (표준편차가 클수록 잡음이 많이 포함됨) IplImage *noiseImage = GaussianNoiseCreate(srcImage, 60); //create a window cvNamedWindow("gaussian noise", CV_WINDOW_AUTOSIZE); //show image cvShowImage("gaussian noise", noiseImage); cvWaitKey(0); //release image cvReleaseImage(&noiseImage); } //가우시안 잡음 생성 함수 //Box-Muller(통계학의 변수변환 방법) 사용 IplImage* GaussianNoiseCreate(IplImage *img, int std) { int height = img->height; int width = img->width; int step = img->widthStep; uchar* data = (uchar*)img->imageData; int imgSize = width * height *img->nChannels; time_t nowTime; srand(time(&nowTime)); int r1, r2; double random1, random2, normal, stdNormal, tmp; do { r1 = rand() % width; r2 = rand() % height; random1 = (double)rand() / RAND_MAX; random2 = (double)rand() / RAND_MAX; stdNormal = sqrt(-2.0 * log(random1)) * cos(2 * 3.14159 * random2); normal = std * stdNormal; int index = r1 * step + r2; if (index >= imgSize) { index = imgSize-1; } tmp = data[index] + normal; if (tmp < 0) { data[index] = 0; } else if (tmp > 255) { data[index] = 255; } else { data[index] = (unsigned char)tmp; } imgSize--; } while (imgSize > 0); return img; } | cs |
결과
'IT > - 프로그래밍' 카테고리의 다른 글
OpenCV 가우시안 잡음 제거하기 (평균필터링 사용) (0) | 2017.04.23 |
---|---|
OpenCV 잡음이 있는 이미지 생성하기 (임펄스 잡음) (0) | 2017.04.22 |
OpenCV 이미지 샤프닝(세세한 부분을 강조) 하기 (0) | 2017.04.20 |
OpenCV 이미지 가우시안 필터링 하기 (0) | 2017.04.19 |
OpenCV 이미지 중앙값 필터링 하기 (0) | 2017.04.18 |