PIL - 使用虚拟框标识对象

时间:2012-10-19 22:47:11

标签: python image image-processing python-imaging-library

我有一个图像(抱歉无法将其链接用于版权目的),其中的字符用黑线标出。描绘角色的黑线是图片中最黑暗的东西(计划使用这个事实来帮助找到它)。我需要做的是获得四个坐标,在角色周围绘制一个虚拟框。该框应尽可能小,同时仍将轮廓字符保留在其内容中。我打算使用这个盒子来帮助通过使用盒子的中心点来确定角色图形的中心点。

我开始尝试识别大纲的一部分。由于它是图像上最暗的一行,我使用getextrema()在轮廓上获得至少一个点,但我无法弄清楚如何获得更多的点然后将这些点组合成一个盒子。

非常感谢对这个问题的任何见解。干杯!

  • 编辑*

这就是我现在所拥有的:

im = Image.open("pic.jpg")
im = im.convert("L")
lo, hi = im.getextrema()
im = im.point(lambda p: p == lo)
rect = im.getbbox()
x = 0.5 * (rect[0] + rect[2])
y = 0.5 * (rect[1] + rect[3])

进入这个数字似乎非常一致,但它真的不是那么接近中心。知道为什么吗?

1 个答案:

答案 0 :(得分:1)

  1. 找到一个合适的阈值,用于将轮廓与图像的其余部分分开,可能使用您已有的极值。如果对比度足够大,这不应该太难,只需添加一些值即可。
  2. 使用您找到的值对图像进行阈值处理,请参阅this question。您希望暗部分在二进制阈值图像中变为白色,因此请使用小于阈值(lambda p: p < T)。
  3. 使用thresholdedImage.getbbox()获取大纲的边界框