以编程方式检测图像是否具有边框(返回布尔值)

时间:2012-06-11 18:27:21

标签: python imagemagick css3

首先,我看过这篇文章。 How to detect an image border programmatically? 他似乎在寻找一个稍微不同的问题,虽然找到了X / Y坐标。

我只想查找给定照片周围是否存在实体边框。 我已经探索过使用ImageMagick,但这是最好的选择吗? 我从未做过任何与图像相关的编程,所以我希望只有一个简单的api可以解决这个问题。 我对如何使用这些库也很新,所以任何建议都值得赞赏。 我更喜欢Python或Java的解决方案,但一切都很好。

谢谢!

3 个答案:

答案 0 :(得分:4)

我回答了相关问题here,删除了图片周围的任何边框,它使用了PIL。您可以轻松调整代码,使其返回TrueFalse是否存在边框,如下所示:

from PIL import Image, ImageChops

def is_there_a_border(im):
    bg = Image.new(im.mode, im.size, im.getpixel((0,0)))
    diff = ImageChops.difference(im, bg)
    diff = ImageChops.add(diff, diff, 2.0, -100)
    bbox = diff.getbbox()
    return bbox != (0,0,im.size[0],im.size[1])

但是,即使图像的一侧只有边框,也会返回True。但听起来你想知道图像周围是否有边框。为此,请将最后一行更改为:

    return all((bbox[0], bbox[1], (bbox[0] + bbox[2]) <= im.size[0], 
                                  (bbox[1] + bbox[3]) <= im.size[1]))

如果每边都有边框,则只返回true。

例如:

False:

enter image description here

False:

enter image description here

True:

enter image description here

答案 1 :(得分:1)

在看到fraxel的答案之后,我发现如果你不在乎边框有多宽,你可以裁剪出每边最外面的像素并检查颜色是否均匀。应该很快;通过将背景颜色设置为0,0处的像素,并裁剪1,1到w-2,h-2,剩下的图像应该只有1种颜色。

答案 2 :(得分:0)

因此,最后一行的正确代码应为:

 return all((bbox[0], bbox[1], bbox[2]) < im.size[0], bbox[3] < im.size[1]))

对吗?对于getbbox()函数的最后两个参数,是“边框的右下像素坐标”,而不是宽度和高度