图像处理:Sobel filter 的结果原来是灰色而不是黑白?

Image Processing: The result of Sobel filter turns out to be gray instead of black and white?

我正在尝试自己实现 Sobel 过滤器。

我得到的结果看起来很像这个(灰色):

但不是这样的(黑白渐变):

我试过使用阈值,但感觉不对:

有什么方法可以把灰度变成黑白渐变结果吗?


以下是我在 C# 中过滤图像的步骤:

  1. 从文件转换位图(已经是灰度)
  2. 用 Sobel 内核对每个像素进行卷积(例如水平)

    private static float[][] Sobel3x3Kernel_Horizontal() {

    return new float[][] { new float[]{ 1, 2, 1}, new float[]{ 0, 0, 0 }, new float[]{ -1, -2, -1} }; }

  3. 重新映射所有值,让它们落在0~255范围内(否则会有负值或大于255的值,不能用来做Bitmap.SetPixel(int x, int y, Color 颜色)

  4. 输出位图结果(灰度)

要复制您从维基百科链接的图像,请按照下列步骤操作:

  1. 计算与Sobel核的卷积得到x导数dx.

  2. 计算另一个卷积以获得y导数dy(转置内核)。

  3. 这两个导数一起形成了梯度(每个像素的向量值)。通过计算sqrt(dx^2 + dy^2)确定量级。 ^2这里表示正方形。

  4. 如果您想要纯黑白结果,请对结果进行阈值处理,否则通过将结果乘以某个值来缩放结果,以便显示的图像看起来不错。

请注意,您所谓的 "grayscale image problem" 只是将 0 值映射(您的 3rd 步骤)到中间灰色,以便可以显示负值。这是显示导数的正确方法,否则负值将被剪掉,因此不可见。这些负值是导​​数的重要组成部分。但是这个映射应该用于显示,进一步的计算应该总是在原始值上进行。