2016-11-09 16 views
0

이진 이미지에 대한 형태 학적 침식 작업을 구현하려고합니다. 내가 그것을 실행 한 후에 모든 것은 검은 색이다. 구조화 요소 (int 배열 요소)를 3x3 사각형으로 설정했습니다.이진 부식이 검은 색으로 변합니다.

const int radius = 1; 
int element[(radius * 2 + 1)*(radius * 2 + 1)] = { 1,1,1,1,1,1,1,1,1 }; 
int iBitPerPixel = pDoc->_bmp->bitsperpixel; 
int iWidth = pDoc->_bmp->width; 
int iHeight = pDoc->_bmp->height; 
BYTE *pImg = pDoc->_bmp->point; 
int Wp = iWidth; 

BYTE copy[319*240*10]; 

int r = (3 * iWidth) % 6; 
int p = (6 - r) % 6; 
Wp = 3 * iWidth + p; 



for (int i = iHeight - 1; i >= 0; i--) 
    for (int j = 0; j < iWidth; j++) 
    { 
     copy[i*Wp + j * 3] = pImg[i*Wp + j * 3]; 
     pImg[i*Wp + j * 3] = 0; 
     pImg[i*Wp + j * 3 + 1] = 0; 
     pImg[i*Wp + j * 3 + 2] = 0; 
    } 

bool fit = true; 
for (int i = iHeight - 1; i >= 0; i--) 
    for (int j = 0; j < iWidth; j++) 
    { 
     for (int x = radius; x <= -radius; x--) 
      for (int y = -radius; y <= radius; y++) 
      { 
       if (i + x < 0 || i + x >= iHeight|| j + y < 0) continue; 
       if (element[(x + radius)*radius + y + radius] == 1 && copy[(i + x)*Wp + (j + y) * 3] == 0) 
       { 
        fit = false; 
        break; 
       } 
      } 

     if (fit) 
      for (int x = radius; x <= -radius; x--) 
       for (int y = -radius; y <= radius; y++) 
        pImg[(i + x)*Wp + (j + y) * 3] = 255; 

    } 

답변

0

이 루프에서 두 개의 오류를 만듭니다. for (int x = radius; x <= -radius; x--). x을 1로 초기화하면 조건은 x <= -1이므로 루프를 입력하지 마십시오.

부록 :

  1. ij에 당신의 두 개의 루프가 같은 방향으로 가야하지?
  2. 테스트에서 무엇을하고 싶은지 이해할 수 없습니다. if (element[(x + radius)*radius + y + radius] == 1 && copy[(i + x)*Wp + (j + y) * 3] == 0). 침식의 원리는 주어진 이웃 (구조 요소에 의해 정의 됨) 내에 최소값을 유지하는 것입니다.
  3. 기본 알고리즘의 작동 방식을 이해하기 위해 직접 메서드를 구현하려는 경우를 제외하고는 SMIL 라이브러리에서 고도로 최적화 된 수학 형태 메서드를 찾을 수 있습니다. OpenCV도 있습니다.
관련 문제