我读 https://en.wikipedia.org/wiki/Sobel_operator
说,我们想检测灰度图像中的水平边缘。
请注意 - 我将矩阵编写为行序列。问题 1 ) 然后我应该取 [1,0,-1; 2,0,-
2 ; 1,0,-1](来自上面的 Gx= 矩阵 * A 维基链接)并将其与给定的图像卷积。 所以我将在每个像素上叠加 [-1,0,1 ; -2,0,2 ; -1,0,1](从矩阵的 180 度旋转获得)。
是吗?
问题 2 ) 假设图像是 [a,b,c;d,X,f;g,h,i] 然后我将像素 X 替换为 -a+c-2d+2f-g+i=Y 。如果 Y 结果为负数怎么办?(像素值不能为负数)。
问题 3 ) 我可以通过仅查看应用 sobel 运算符后获得的矩阵(不将该输出矩阵呈现为图像)来对图像的特定像素做出任何结论吗?
问题 4 ) 是否 - 根据使用的矩阵 - 水平或垂直边缘将在输出图像中强调,而不是两者兼而有之?
谢谢。
1) 对。
2)标志会告诉你边缘的极性;如果要保持两个极性,请取绝对值;否则仅保留正部分或负部分。
3)边沿是滤波器响应高的地方。
4)对,尽管一些斜边也可见。
像素值不能为负数
好吧,根据定义,现在可以了。使用偏移表示可以轻松可视化(平面 = 灰色,负 = 暗,正 = 亮),使用 2 的补码表示通常使数学更容易(但如果直接渲染看起来非常糟糕和混乱)。无论哪种方式,如果你想使用相同的格式(听起来像你这样做,否则不会有问题),你还必须将结果固定和/或缩放到新的范围,因为在最坏的情况下,它们不适合。自然图像中的大多数像素不会有巨大的导数,因此夹紧不会造成太多麻烦,但这是否合适取决于您需要这些信息的原因。缩放会在任何地方放置小细节。
显然,如果您使用不同的目标格式(每像素的位数多于源),这甚至不是问题。如果您有 8 位输入,则可以以签名的 16 位格式存储结果,而不会遇到任何麻烦。
是不是 - 取决于使用的矩阵 - 水平或垂直边缘将在输出图像中强调,而不是两者兼而有之?
是的,但您可以通过获取梯度矢量的长度来组合它们。这将大致相等地处理任何方向(不仅是 H 或 V,还包括对角线和两者之间的角度)的边。您也可以只对水平和垂直导数的绝对值求和,这是一种更简单的计算,但它对角线边缘的处理方式与直边不同。