Обработка изображений: результат фильтра Собеля оказывается серым, а не черно-белым? - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь реализовать фильтр Собеля.

Полученный результат выглядит очень похоже на это (серый):

enter image description here

Но не так (черно-белый с градиентом):

enter image description here

Я пытался использовать порог, но это не правильно:

Есть ли какой-нибудь способ, которым я могу превратить шкалу серого в черно-белый с градиентом результат?


Ниже приведены шаги, которые я использую для фильтрации изображения в C #:

  1. Преобразование растрового изображения из файла (уже в оттенках серого)
  2. Свертка каждого пикселя с помощью Собеляядро (например, горизонтальное)

    private static float[][] Sobel3x3Kernel_Horizontal() {</p>
    
    <code>    return new float[][] {
            new float[]{ 1, 2, 1},
            new float[]{ 0, 0, 0 },
            new float[]{ -1, -2, -1}
        };
    
    }
    </code>

  3. Переназначить все значения, чтобы они попадали в диапазон 0 ~ 255 (в противном случае будут отрицательные значения или значения, превышающие255, который нельзя использовать для Bitmap.SetPixel (int x, int y, Color color)

  4. Вывод результата растрового изображения (в оттенках серого)

1 Ответ

0 голосов
/ 21 октября 2018

Чтобы скопировать изображение, которое вы связали из Википедии, выполните следующие действия:

  1. Вычислите свертку с ядром Собеля, чтобы получить производную x dx.

  2. Вычислите другую свертку для получения производной y dy (транспонируйте ядро).

  3. Эти две производные вместе образуют градиент (векторное значение в каждом пикселе),Определите величину, вычислив sqrt(dx^2 + dy^2).^2 здесь обозначает квадрат.

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

Обратите внимание, что то, что вы называете "проблемой изображения в оттенках серого" , является просто отображением (ваш шаг 3 rd )0 значений до среднего серого, так что отрицательные значения могут быть показаны.Это правильный способ отображения производной, так как в противном случае отрицательные значения будут обрезаны и, следовательно, не видны.Эти отрицательные значения являются важной частью производной.Но это отображение должно only использоваться для отображения, дальнейшие вычисления всегда должны выполняться для исходных значений.

...