2016-11-23 3 views
-2

가우스 노이즈가있는 입력 이미지에 가우스 노이즈를 추가하려고합니다. PDF (확률 분포 함수)이며이 코드를 작성하고 여러 번 확인하지만 출력이 정확하지 않습니다. 혼란 스럽습니다.C++로 가우스 노이즈 추가

int main() { 
    Mat Frame; 
    string address; 
    printf("Please Drag and Drop Your Image"); 
    cin >> address; 
    Frame = imread(address, CV_LOAD_IMAGE_GRAYSCALE); 
    int arrayOfIntensity[256] = { 0 }, intensity; 

    //NEW COUNT INTENSITY OF EVERY PIXEL 
    for (int i = 0; i < Frame.rows; i++) 
     for (int j = 0; j < Frame.cols; j++) 
      arrayOfIntensity[Frame.at<uchar>(i, j)]++; 

    //SUM OF INTENSITY 
    int sumOfintensity = 0; 
    for (int i = 0; i < Frame.rows; i++) 
     for (int j = 0; j < Frame.cols; j++) 
      sumOfintensity += Frame.at<uchar>(i, j); 
    //AVG OF INTENSITY 
    double avgOfintensity = sumOfintensity, varOfintensity = 0; 
    avgOfintensity /= Frame.rows*Frame.cols; 
    //VARIANCE OF INTENSITY 
    for (int i = 0; i < Frame.rows; i++) 
     for (int j = 0; j < Frame.cols; j++) 
      varOfintensity += pow(Frame.at<uchar>(i, j) - avgOfintensity, 2); 
    varOfintensity/= Frame.rows*Frame.cols; 
    //PROBABILITY 
    float probability[256] = { 0 }, intermediate[256] = { 0 }, factor, sumProb[256] = { 0 }, newSumProb[256] = { 0 }; 
    factor = (sqrt(6.28)*avgOfintensity); 
    cout << "factor :" << factor << endl; 
    factor = 1/factor; 
    cout << "new factor :" << factor << endl; 
    for (int i = 0; i < 256; i++) { 
     intermediate[i] =-1*(pow(i - avgOfintensity, 2))/(2 * pow(varOfintensity, 2)); 
     probability[i] = factor*(pow(2.718281, intermediate[i])); 
     //SUM OF PROBABILTY 
     if (i == 0) 
      sumProb[i] = probability[i]; 
     else 
      sumProb[i] = probability[i] + sumProb[i - 1]; 
    } 
    //INTO 0-1 RANGE 
    for (int i = 0; i < 256; i++) 
     newSumProb[i] = sumProb[i]/ sumProb[255]; 

    float finalProb[256] = { 0 }; 
    for (int i = 0; i < 256; i++) { 
     double random = (rand() % 10)/1000000.0 +(rand() % 10)/100000.0 +(rand() % 10)/10000.0 +(rand() % 10)/1000.0 +(rand() % 10)/100.0+ (rand() % 10)/10.0; 
     for (int j = 0; j < 256; j++) { 
      if (random<newSumProb[j]) { 
       finalProb[i] = newSumProb[j]; 
       break; 
      } 
     } 
    } 
    int max = 0; 
    for (int i = 0; i < 256; i++) 
     if (finalProb[max]<finalProb[i]) 
      max = i; 

    for (int i = 0; i < 256; i++) 
     finalProb[i] =(finalProb[i] * 256.0)/ finalProb[max]; 

    for (int i = 0; i < Frame.rows; i++) 
     for (int j = 0; j < Frame.cols; j++) 
      Frame.at<uchar>(i, j) = saturate_cast<uchar>(finalProb[Frame.at<uchar>(i, j)]); 

    imshow("Result", Frame); 
    waitKey(); 
} 

올바른 출력 : tihs image is correct output with matlab 내 잘못된 출력 : this image is incorrect output with my code

+1

당신이 당신의 코드가 기대에서 벗어난 곳을보고, 디버거를 사용하려고 했습니까? –

+0

예, 모든 단계의 모든 출력을 확인합니다! 내 문제의 원인은 잘못된 알고리즘이라고 생각합니다. –

+0

올바른 스케일로 노이즈를 추가하고 있습니까? 나는. 이미지 '0-1' 또는'0-255'이며 동일한 스케일의 가우스 노이즈입니까? –

답변

1

는 지금까지 내가 그것을 이해, 코드를 이미지에 가우스 노이즈를 추가하지 않습니다.
가우스 노이즈는 평균과 표준의 2 가지 값으로 정의됩니다.

이미지에 가우스 노이즈를 추가한다는 것은 픽셀 크기의 분포가 정규 분포를 따르는 프레임의 크기 인 새로운 그림을 생성 한 다음이를 실제 이미지에 추가하는 것을 의미합니다 시끄러운.

나는 코드를 완전히 이해하려고 시도하지는 않았지만, 당신이하고있는 일은 픽셀 의존적이며 필요한 것보다 훨씬 복잡한 것으로 보인다.

픽셀이 정규 분포를 따르는 프레임을 생성하려면 같은 분포를 따르는 n 독립 변수의 합계가 정규 분포로 향하는 경향이있는 중앙 제한 정리를 사용할 수 있습니다.

따라서, 당신은 프레임의 각 픽셀로 설정할 수 있습니다

/* Generate a pixel with a random intensity that follows the normal distribution */ 
int n = 30; 
int sum = 0; 
for(int k = 0; k < n; ++k) 
    sum += rand() % 255; 
pixel_i_j = sum/n; 

/* 
* pixel_i_j at this point follows a normal distribution with 
* parameters : 
* - mean = 256/2 = 128 
* - std = std of uniform law between 0 - 256/sqrt(n) 
* 
* So adapt it to the normal law defined by my parameters */ 
pixel_i_j = ((pixel_i_j - mean)/std) * my_std + my_mean; 
+0

감사합니다. 내 코드를 편집하면 제대로 작동하지 않지만 실제로 출력을 변경하십시오. (!) 다음을 참조하십시오. http://s8.picofile.com/file/8275854300/a.png –

+0

법률에 따라 수정 했습니까? 적응하기 전에 픽셀의 분포는 믿습니다. 그러나 위키피디아는 256/2 = 128이고 std는 128/sqrt (n)입니다. 평균이 약 10이고 std가 그보다 작아 지도록 신호를 만들어야하므로 신호 대 잡음비가 양호합니다. –

+0

std가 이전 코멘트에 잘못되었습니다. –