我有一个8位图像,我想用一个矩阵对其进行过滤以进行边缘检测。我的内核矩阵是
0 1 0
1 -4 1
0 1 0
对于某些索引,它给我一个负值。我应该和他们在一起吗?
答案 0 :(得分:3)
您的内核是Laplace过滤器。将其应用于图像会产生拉普拉斯算子的有限差分近似值。 The Laplace operator is not an edge detector by itself。
但是您可以将其用作边缘检测器的构建块:您需要检测零交叉点以找到边缘(这是Marr-Hildreth edge detector)。要找到零交叉点,您需要使用负值。
您还可以使用经过Laplace过滤的图像来锐化图像。如果从原始图像中减去它,则结果将是具有更清晰边缘和更清晰感觉的图像。为此,负值也很重要。
对于这两种应用,如接受的答案所建议的那样,将运算结果钳位是错误的。该钳位会将所有负值设置为0。这意味着不再有零交叉点,因此您找不到边缘,而进行锐化则意味着每个边缘的一侧都不会被锐化。
因此,处理Laplace过滤器的结果最好的做法是保留值。使用带符号的16位整数类型存储结果(实际上,我更喜欢使用浮点类型,这样可以简化很多事情)。
另一方面,如果要将Laplace滤镜的结果显示在屏幕上,则必须对像素值做一些有意义的事情。在这种情况下,常见的做法是为每个像素添加128。这会将零值移至中间灰色值,将负值显示为较暗,将正值显示为较亮。加128后,可以裁剪大于255且小于0的值。如果要避免剪切,也可以进一步拉伸值,例如laplace / 2 + 128
。
答案 1 :(得分:1)
超出范围的值在JPEG中非常常见。一个人通过夹紧来处理它们。
If X < 0 then X := 0 ;
If X > 255 then X := 255 ;