我正在尝试自己实施Sobel过滤器。
我获得的结果看起来与此类似(灰色):
但不是这样(黑白渐变):
我尝试使用阈值,但感觉不正确:
有什么方法可以将灰度转换为带有渐变的黑白结果?
以下是我使用C#过滤图像的步骤:
使用Sobel内核对每个像素进行卷积(例如水平)
private static float[][] Sobel3x3Kernel_Horizontal() {
return new float[][] {
new float[]{ 1, 2, 1},
new float[]{ 0, 0, 0 },
new float[]{ -1, -2, -1}
};
}
重新映射所有值以使其处于0〜255范围内(否则将出现负值或大于255的值,不能用于执行Bitmap.SetPixel(int x,int y,颜色为彩色)
输出位图结果(灰度)
答案 0 :(得分:-1)
要复制您从Wikipedia链接的图像,请按照以下步骤操作:
使用Sobel内核计算卷积以获得x导数dx
。
计算另一个卷积以获得y导数dy
(对内核进行转置)。
这两个导数一起形成梯度(每个像素的向量值)。通过计算sqrt(dx^2 + dy^2)
确定幅度。 ^2
这里表示正方形。
如果要获得纯黑白结果,则将结果阈值设置为阈值;否则,通过将结果乘以某个值来缩放结果,以使显示的图像对您来说看起来不错。
请注意,您所说的“灰度图像问题” 只是将0值映射到中间灰色(您的3 rd 步骤),因此可以显示值。这是显示导数的正确方法,否则负值将被裁剪,因此不可见。这些负值是导数的重要部分。但是,此映射应仅用于显示,应始终对原始值进行进一步的计算。