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

时间:2018-10-21 09:13:01

标签: c# image-processing sobel

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

我获得的结果看起来与此类似(灰色):

enter image description here

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

enter image description here

我尝试使用阈值,但感觉不正确:

有什么方法可以将灰度转换为带有渐变的黑白结果?


以下是我使用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,颜色为彩色)

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

1 个答案:

答案 0 :(得分:-1)

要复制您从Wikipedia链接的图像,请按照以下步骤操作:

  1. 使用Sobel内核计算卷积以获得x导数dx

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

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

  4. 如果要获得纯黑白结果,则将结果阈值设置为阈值;否则,通过将结果乘以某个值来缩放结果,以使显示的图像对您来说看起来不错。

请注意,您所说的“灰度图像问题” 只是将0值映射到中间灰色(您的3 rd 步骤),因此可以显示值。这是显示导数的正确方法,否则负值将被裁剪,因此不可见。这些负值是导​​数的重要部分。但是,此映射应用于显示,应始终对原始值进行进一步的计算。