Skip to main content
 首页 » 编程设计

python之PIL之使用虚拟框识别对象

2025年05月04日6qq号

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

我开始尝试识别轮廓的各个部分。因为它是图像上最暗的线,所以我使用 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. 找到一个适当的阈值,将轮廓与图像的其余部分分开,也许使用您已有的极值。如果对比度足够大,这应该不会太难,只需将一些值添加到最小值即可。
  2. 用您找到的值对图像进行阈值处理,请参阅 this question .您希望二进制阈值图像中的黑暗部分变成白色,因此使用小于阈值 ( lambda p: p < T )。
  3. 使用thresholdedImage.getbbox()获取轮廓的边界框