过滤后如何处理负像素值?

时间:2018-10-28 02:34:57

标签: image-processing convolution edge-detection imagefilter

我有一个8位图像,我想用一个矩阵对其进行过滤以进行边缘检测。我的内核矩阵是

0  1  0
1 -4  1
0  1  0

对于某些索引,它给我一个负值。我应该和他们在一起吗?

2 个答案:

答案 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 ;