2016-11-09 6 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

このループでは、エラーが2つあります。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もあります。
関連する問題