图像处理:Sobel filter 的结果原来是灰色而不是黑白?
Image Processing: The result of Sobel filter turns out to be gray instead of black and white?
我正在尝试自己实现 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, Color 颜色)
输出位图结果(灰度)
要复制您从维基百科链接的图像,请按照下列步骤操作:
计算与Sobel核的卷积得到x导数dx
.
计算另一个卷积以获得y导数dy
(转置内核)。
这两个导数一起形成了梯度(每个像素的向量值)。通过计算sqrt(dx^2 + dy^2)
确定量级。 ^2
这里表示正方形。
如果您想要纯黑白结果,请对结果进行阈值处理,否则通过将结果乘以某个值来缩放结果,以便显示的图像看起来不错。
请注意,您所谓的 "grayscale image problem" 只是将 0 值映射(您的 3rd 步骤)到中间灰色,以便可以显示负值。这是显示导数的正确方法,否则负值将被剪掉,因此不可见。这些负值是导数的重要组成部分。但是这个映射应该只用于显示,进一步的计算应该总是在原始值上进行。
我正在尝试自己实现 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, Color 颜色)
输出位图结果(灰度)
要复制您从维基百科链接的图像,请按照下列步骤操作:
计算与Sobel核的卷积得到x导数
dx
.计算另一个卷积以获得y导数
dy
(转置内核)。这两个导数一起形成了梯度(每个像素的向量值)。通过计算
sqrt(dx^2 + dy^2)
确定量级。^2
这里表示正方形。如果您想要纯黑白结果,请对结果进行阈值处理,否则通过将结果乘以某个值来缩放结果,以便显示的图像看起来不错。
请注意,您所谓的 "grayscale image problem" 只是将 0 值映射(您的 3rd 步骤)到中间灰色,以便可以显示负值。这是显示导数的正确方法,否则负值将被剪掉,因此不可见。这些负值是导数的重要组成部分。但是这个映射应该只用于显示,进一步的计算应该总是在原始值上进行。