Qt - Класс изображения - Не максимальное подавление - C++

Во время кодирования некоторого класса манипуляции с пикселями я реализовал функцию подавления не max.

Код здесь:

signed char * nonMaxSuppress(int windowSize, signed char * pointer) {

int delta = windowSize / 2;

int index;

int counter = 0;
signed char current;
for(int row = 3; row < GLOBAL_HEIGHT - 3; ++row)
{

    for(int col = 3; col < GLOBAL_WIDTH - 3; ++col)
    {

        counter = 0;
        current = pointer[(row * GLOBAL_WIDTH) + col];

        for(int i = 0; i < windowSize; ++i)
        {

            for(int j = 0; j < windowSize; ++j)
            {
                index = ((row - delta + i) * GLOBAL_WIDTH) + (col - delta + j);
                if(current > pointer[index]) {
                    counter++;
                }

            }
        }

        if(counter != ((windowSize * windowSize) - 1)){
            pointer[(row * GLOBAL_WIDTH) + col] = 0;
        }

    }
}
return pointer;}

Теперь результирующая картинка до и после не максимального подавления довольно странная. Такое ощущение, что какая-то линия начала появляться на ровном месте. Пожалуйста, смотрите прикрепленные картинки (до и после не максимального подавления).

Я буду благодарен в случае любой помощи.

Спасибо!

Пожалуйста, не обращайте внимания на ошибку в 3 пикселя, которая у меня есть на краях изображений, и только для вашего знания эти изображения после оттенков серого и Diffrence Of Gaussian

До не макс подавления

После не макс подавления

Можете ли вы увидеть добавленные строки? Что это?

1 ответ

Решение

Вы пытаетесь выполнить подавление на месте. Рассмотрим пиксель (столбец, строка). Как только вы измените его содержимое, следующий пиксель (col+1, строка) будет иметь другую окрестность windowSize*windowSize.

Чтобы решить эту проблему, вы должны использовать другой массив в качестве вывода. Просто замени

    if(counter != ((windowSize * windowSize) - 1)){
        pointer[(row * GLOBAL_WIDTH) + col] = 0;
    }

с

    output[(row * GLOBAL_WIDTH) + col] =
              (counter != ((windowSize * windowSize) - 1)) ? 0 : current;
Другие вопросы по тегам