Бинарная эрозия

Я пытаюсь реализовать операцию морфологической эрозии для двоичного изображения. Все черное после того, как я запускаю его Я установил свой структурирующий элемент (элемент массива 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;

    }

1 ответ

Вы делаете две ошибки в этом цикле: for (int x = radius; x <= -radius; x--), Вы инициализируете x на 1, а затем условие x <= -1Таким образом, вы никогда не входите в цикл.

Приложение:

  1. Почему ваши две петли на i а также jне идти в том же направлении?
  2. Я не понимаю, что вы хотите сделать в тесте if (element[(x + radius)*radius + y + radius] == 1 && copy[(i + x)*Wp + (j + y) * 3] == 0), Принцип эрозии состоит в том, чтобы сохранить минимальное значение в пределах данной окрестности (определяемой структурирующим элементом).
  3. За исключением случаев, когда вы действительно хотите реализовать методы самостоятельно, чтобы понять, как работает основной алгоритм, иначе вы найдете высоко оптимизированные методы математической морфологии в библиотеке SMIL. Существует также OpenCV.
Другие вопросы по тегам