首先,我已经阅读了这篇文章。如何以编程方式检测图像边框? 不过,他似乎在问一个稍微不同的问题,即找到 X/Y 坐标。
我只是想找出给定照片周围是否存在实心边框。我已经使用 ImageMagick 进行了探索,但这是最好的选择吗?我从来没有做过任何与图像相关的编程,所以我希望只有一个简单的 api 可以解决这个问题。我对如何使用这些库也很陌生,所以任何建议都值得赞赏。我更喜欢 Python 或 Java 的解决方案,不过一切都很好。
谢谢!
首先,我已经阅读了这篇文章。如何以编程方式检测图像边框? 不过,他似乎在问一个稍微不同的问题,即找到 X/Y 坐标。
我只是想找出给定照片周围是否存在实心边框。我已经使用 ImageMagick 进行了探索,但这是最好的选择吗?我从来没有做过任何与图像相关的编程,所以我希望只有一个简单的 api 可以解决这个问题。我对如何使用这些库也很陌生,所以任何建议都值得赞赏。我更喜欢 Python 或 Java 的解决方案,不过一切都很好。
谢谢!
我在这里回答了一个相关问题,它删除了图像周围的任何边框,它使用PIL。您可以轻松地调整代码,使其返回True
或False
是否有边框,如下所示:
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:
看到 fraxel 的回答后,我突然想到,如果您不在乎边框有多宽,您可以裁剪出每边的最外层像素并检查颜色是否均匀。应该很快;通过将背景颜色设置为 0,0 像素的颜色,并将 1,1 裁剪为 w-2,h-2,剩余的图像应该正好有 1 种颜色。
所以,最后一行的正确代码应该是:
return all((bbox[0], bbox[1], bbox[2]) < im.size[0], bbox[3] < im.size[1]))
对?对于 getbbox() 函数的最后两个参数,是“边界框的右下像素坐标”,而不是宽度和高度