3

首先,我已经阅读了这篇文章。如何以编程方式检测图像边框? 不过,他似乎在问一个稍微不同的问题,即找到 X/Y 坐标。

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

谢谢!

4

3 回答 3

4

我在这里回答了一个相关问题,它删除了图像周围的任何边框,它使用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:

在此处输入图像描述

False:

在此处输入图像描述

True:

在此处输入图像描述

于 2012-06-11T19:06:12.430 回答
1

看到 fraxel 的回答后,我突然想到,如果您不在乎边框有多宽,您可以裁剪出每边的最外层像素并检查颜色是否均匀。应该很快;通过将背景颜色设置为 0,0 像素的颜色,并将 1,1 裁剪为 w-2,h-2,剩余的图像应该正好有 1 种颜色。

于 2012-06-11T21:01:32.757 回答
0

所以,最后一行的正确代码应该是:

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

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

于 2019-08-14T03:16:14.510 回答