我读过https://en.wikipedia.org/wiki/Sobel_operator
比如说,我们想要检测灰度图像中的水平边缘
请注意 - 我已将矩阵写为行序列。
问题1)然后我应该[1,0,-1; 2,0,-2; 1,0,-1](来自G x =矩阵*上面的wiki链接的A)并将其与给定图像卷积。
所以我会叠加[-1,0,1; -2,0,2; -1,0,1](从矩阵的180度旋转获得)在每个像素上。
是吗?
问题2)假设图像是[a,b,c; d,X,f; g,h,i],那么我将用-a + c-2d + 2f-g + i = Y代替像素X.如果Y结果为负,该怎么办? (像素值不能为负)。
问题3)我可以通过仅仅看到在应用sobel算子后获得的矩阵(不将该输出矩阵渲染为图像)来对图像的特定像素做出任何结论吗?
问题4)是否 - 根据使用的矩阵 - 水平或垂直边缘将在输出图像中强调,但不是两者都强调?
感谢。
答案 0 :(得分:1)
1)对。
2)标志会告诉你边缘的极性;如果你想保持两个极性,取绝对值;否则只保留正面或负面部分。
3)边缘是滤波器响应高的地方。
4)右边,虽然也可以看到一些倾斜的边缘。
答案 1 :(得分:0)
像素值不能为负
现在它可以,根据定义。使用偏移表示可以很容易地进行可视化(平面=灰色,负面=黑暗,正面=明亮),使用2的补码表示通常会使数学更容易(但看起来非常糟糕并且如果直接渲染会造成混淆)。无论哪种方式,如果你想使用相同的格式(听起来像你做,否则没有问题)你还必须将结果钳制和/或缩放到新的范围,因为在最坏的情况下,他们赢了&#39适合。自然图像中的大多数像素都没有巨大的衍生物,因此钳位不会造成太大麻烦,但这是否合适取决于您需要此信息的内容。扩展将在任何地方删除小细节。
显然,如果你使用不同的目标格式(每个像素的比特数多于源),这首先不是问题。如果您有8位输入,您可以毫无困难地将结果存储在带符号的16位格式中。
是这样 - 根据使用的矩阵 - 输出图像中是否会强调水平或垂直边缘,而不是两者都强调?
是的,但您可以通过获取渐变矢量的长度来组合它们。这将大致相等地处理任何方向(不仅是H或V,还有对角线和中间的角度)的边缘。你也可以只计算水平和垂直导数的绝对值,这是一个更简单的计算,但它对角线的边缘不同于直边。