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;

    }
4

1 回答 1

0

您在此循环中犯了两个错误:for (int x = radius; x <= -radius; x--). 您在 1 处初始化x,然后条件为x <= -1,因此您永远不会进入循环。

附件:

  1. 为什么你的两个循环不上同一个方向ij
  2. 我不明白你想在测试中做什么if (element[(x + radius)*radius + y + radius] == 1 && copy[(i + x)*Wp + (j + y) * 3] == 0)。侵蚀的原理是将最小值保持在给定的邻域内(由结构元素定义)。
  3. 除非您确实想自己实现这些方法以了解基本算法的工作原理,否则您会在SMIL库中找到高度优化的数学形态学方法。还有OpenCV。
于 2016-12-02T17:37:32.687 回答