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

Я пытаюсь реализовать операцию морфологической эрозии для двоичного изображения. Все черное после того, как я управляю этим все же. Я установил свой структурирующий элемент (элемент массива int) в квадрат 3×3.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]