Как обрабатывать значения-значения после свертки с sobel-kernel - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь написать программу (на практике C ++), которая может определять края изображения.Я использую SFML для загрузки изображения.

Я попробовал операцию Собеля и запутался с выходными значениями.Я получаю значение интенсивности от пикселей вокруг моего текущего пикселя, и я умножаю их на соответствующее значение ядра Собеля.Эти значения складываются вместе.

Моя проблема в том, что значения интенсивности входного сигнала варьируются от 0 до 255, но мое значение выхода может варьироваться от некоторого отрицательного значения (может быть меньше -255) до некоторого положительного значения (может быть больше 255).

Я не смог найти подсказки о том, как преобразовать их в значения в оттенках серого;мой InputImage - Greyscale, то есть r, g, b похожи.В качестве матрицы / ядра Собеля я использовал собственный класс Matrix.

// The Sobel-kernel-x looks like that
int kernel_x[] = { 1, 0, -1,
                  2, 0, -2,
                  1, 0, -1 }



for (int y = 1; y < height - 1; y++)
{
    for (int x = 1; x < width - 1; x++)
    {
        int sum = 0;
        for (int i = -1; i <= 1; i++)
        {
            for (int j = -1; j <= 1; j++)
            {
                sum += img.getPixel(x + j, y + i).r * sobelkernel_x.at(j + 1, i + 1);
            }
        }
        //std::cout << sum << std::endl;
        cur_img->setPixel(x, y, sf::Color(sum, sum, sum));
    }
}

1 Ответ

0 голосов
/ 01 мая 2019

Попробуйте что-то вроде этого:

int MIN_SOBEL_VAL = minValue(sobelMatrix[][]);
int MAX_SOBEL_VAL = maxValue(sobelMatrix[][]);

int outputMatrix[][];

void normalizer(sobelMatrix, MIN_SOBEL_VAL, MAX_SOBEL_VAL, outputMatrix, 0, 255) {
    for(i = 0 -> N)
        for(j = 0 -> M)
            outputMatrix[i][j] = g(sobelMatrix[i][j],MIN_SOBEL_VAL, MAX_SOBEL_VAL, 0, 255);
}

, где g (n, a, b, x, y) - это функция, которая отображает интервал a, b => x, y линейно.

для вашего случая;

g(...) = (n - MIN_SOBEL_VAL)/(MAX_SOBEL_VAL - MIN_SOBEL_VAL) * (255 - 0)

Это отобразит ваш sobelMatrix в outputMatrix и со значениями между 255-0.

...