【问题标题】:PIL - Identifying an object with a virtual boxPIL - 用虚拟盒子识别物体
【发布时间】:2012-10-10 14:41:30
【问题描述】:

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

我开始尝试识别轮廓的各个部分。由于它是图像上最暗的线,我使用 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])

进入人物内部似乎很一致,但实际上并没有那么靠近中心。知道为什么吗?

【问题讨论】:

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


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

    【讨论】:

    • 谢谢。你知道如何得到盒子的中心点吗?
    • 这是一个矩形!中心在 0.5*(left+right), 0.5*(top+bottom)。
    • 我用我现在拥有的内容更新了我的原始帖子。介意看看吗?
    • 另外,这是我在上面的代码中使用的图片:imageshack.us/a/img5/234/capt.jpg
    猜你喜欢
    • 2018-10-21
    • 2014-02-22
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多