잡음이 있는 이미지 생성하기 (가우시안 잡음)

가우시안 잡음 : 가우시안 밀도 함수를 갖는 잡음



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



결과



+ Recent posts