2017-10-27 11 views
0

다음은 그레이 스케일 이미지에서 수행되는 내 sobel 필터 함수입니다. 분명히 나는 ​​모든 검정색 이미지를 얻고 있기 때문에 정확한 계산을 수행하지 않을 것입니다. 나는 이미 프로젝트를 시작했지만 그 결과가 옳지 않다는 것이 내게 성가시다. 코드가 일부 개선을 사용할 수 있지만C++에서 sobel 필터 함수를 실행할 때 내가 뭘 잘못하고 있니?

int sobelH[3][3] = { -1, 0, 1, 
        -2, 0, 2, 
        -1, 0, 1 }, 

    sobelV[3][3] = { 1, 2, 1, 
        0, 0, 0, 
        -1, -2, -1 }; 

//variable declaration 
int mag; 
int pix_x, pix_y = 0; 
int img_x, img_y; 

for (img_x = 0; img_x < img->x; img_x++) 
{ 
    for (img_y = 0; img_y < img->y; img_y++) 
    { 
      pix_x = 0; 
      pix_y = 0; 

      //calculating the X and Y convolutions 
      for (int i = -1; i <= 1; i++) 
      { 
       for (int j = -1; j <= 1; j++) 
       { 
        pix_x += (img->data[img_y * img->x + img_x].red + img->data[img_y * img->x + img_x].green + img->data[img_y * img->x + img_x].blue) * sobelH[1 + i][1 + j]; 
        pix_y += (img->data[img_y * img->x + img_x].red + img->data[img_y * img->x + img_x].green + img->data[img_y * img->x + img_x].blue) * sobelV[1 + i][1 + j]; 
       } 
      } 

     //Gradient magnitude 
     mag = sqrt((pix_x * pix_x) + (pix_y * pix_y)); 

     if (mag > RGB_COMPONENT_COLOR) 
      mag = 255; 
     if (mag < 0) 
      mag = 0; 

     //Setting the new pixel value 
     img->data[img_y * img->x + img_x].red = mag; 
     img->data[img_y * img->x + img_x].green = mag; 
     img->data[img_y * img->x + img_x].blue = mag; 
    } 
} 
+0

이것이 문제를 해결하는지 모르겠지만'pix_x'와'pix_y'는 부호가 없지만 음의 값을 산출 할 수있는 계산을 사용하십시오. (; img_x < img-> X, img_x = 0 img_x ++)이 => 수정 – vu1p3n0x

+0

그것은 문제가 해결되지 않고 도움이 vu1p3n0x – Allie

+0

PLZ @ 감사 – flamelite

답변

1

는 주된 이유는 img_yimg_x 불변의 회선을 계산한다는 것입니다. 당신이해야 할 것은 : 실제로

pix_x += (img->data[img_y * img->x + img_x + i].red + img->data[img_y * img->x + img_x + i].green + img->data[img_y * img->x + img_x + i].blue) * sobelH[1 + i][1 + j]; 

, 당신은 일정한 이미지로 회선을 계산하는 경우, 그것은 단지 검은 색으로됩니다 있도록 소벨 회선은 대칭이다.

위의 예에서는 이미지의 테두리를 고려하지 않았습니다. 픽셀 배열 외부에있는 픽셀에는 액세스하지 않아야합니다.

0

또 다른 실수는 입력 이미지에 쓰는 것입니다. 위치 (x, y)에서 작성한 다음, 잘못된 값인 (x, y)에서 수정 된 값을 사용하여 위치 (x + 1, y)에 대한 필터 결과를 계산합니다.

결과를 새 이미지에 써야합니다.