2016-11-09 74 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。