自动裁剪图像(自动识别图像与背景)

Posted

技术标签:

【中文标题】自动裁剪图像(自动识别图像与背景)【英文标题】:Automatic Cropping of Images(Automatic indentification image vs background) 【发布时间】:2011-02-07 18:18:02 【问题描述】:

我正在寻找一种裁剪上传图像的方法。如果用户提供要裁剪的尺寸/位置,我花了很多时间搜索该站点并找到很多好的解决方案。

我的照片大多是在较暗背景下拍摄的纸片。想想在稍暗(但不是标准)的背景下拍摄的驾驶执照、信用卡、票根的手机照片。我正在寻找一种方法来在上传之前或之后让我的代码识别应该裁剪的内容。

在一个完美的世界中,一些聪明人会就裁剪的内容提出建议,并让用户有机会最终确定。这将允许不太完美的裁剪算法。

在根据第一个答案查找“修剪”而不是裁剪之后,似乎我可以使用 Imagemagick imagemagick.org/script/api.php 做到这一点

Imagemagick 似乎在 PHP 和 Ruby 中有接口。它支持修剪“模糊”图像,其中边界不一致。我正在寻找建议的问题是对图形引擎的建议,该引擎具有良好的逻辑来查找图像的边缘。有没有比 imagemagick 更好的引擎?

【问题讨论】:

如果有一种方法可以使页面上不出现颜色的统一背景,您可以相当容易地选择背景像素并使用它们来定位您的裁剪边界。 您对“引擎”的选择取决于您的目标语言。你在用什么? 【参考方案1】:

看看下面的结果是否令人满意。我在 Mathematica 中实现了一个小程序来做到这一点。如果您喜欢结果,我可以进一步解释算法,或者您可以自己在线查看 Mathematica 帮助文件。

我们从这些图片开始:

并定义如下函数:

f[image_] := 
 ImageCrop@
   ImageMultiply[image, 
    ColorNegate@
     Erosion[Dilation[
       DeleteSmallComponents[Binarize@ColorNegate@image, 10000], 3], 
      3]] // ImageAdjust  

结果是:

HTH!

【讨论】:

这些结果令人印象深刻。你介意更详细地解释一下吗?我想实现类似的东西——尽管可能使用 PIL 而不是 Mathematica。 @bjmc:仅使用 PIL 会使您的任务变得困难,请考虑至少将 scipy 与 opencv 一起使用。这个 Mathematica 代码中的所有步骤都很简单,Binarize 使用 otsu 阈值,DeleteSmallComponents 可以使用scipy.ndimage.label 复制,腐蚀和膨胀很容易获得。但是,对于不太不同的图像,此代码会失败。考虑图像i.stack.imgur.com/SvoQe.jpg,结果与此精确代码:i.imgur.com/xyVtj.jpg。检查***.com/questions/14224995/…。【参考方案2】:

请注意,在每个像素的基础上,您要裁剪的背景是不一致的。存在细微(有时不那么细微)的变化,您需要使用 容差 加以考虑。

如果您熟悉 Adob​​e Photoshop,那么有一个功能可以完全按照您的建议执行(图像 -> 修剪)。它的工作原理是查看用户选择的角像素(左上角、右上角等),然后确定最不属于该颜色的 像素。

在编程中,您需要遍历图像中的像素,并确定不是所选颜色的不是的最顶部和最底部像素的 Y 坐标,最左边和最右边。然后这些坐标确定作物尺寸。

在决定像素是否属于所选颜色时,您可以通过考虑百分比差异来引入容差。换句话说,如果背景不是一致的白色(RGB 255、255、255),您可能需要允许一些变化。

您没有提及编程语言,因此您可以自行研究可能想要利用的图形库和函数。

【讨论】:

这很有帮助......我的第一个问题是我在考虑裁剪而不是修剪......似乎我可以用imagemagick.org/script/api.php 来做到这一点【参考方案3】:

一个可能有用的短语是“saliency” - 识别图像的“有趣”区域。一个开始研究这个的地方是Microsoft Research - 您可以使用概述了“有趣部分”的图像示例。这是否达到了您的要求?

【讨论】:

以上是关于自动裁剪图像(自动识别图像与背景)的主要内容,如果未能解决你的问题,请参考以下文章

如何自动裁剪和居中图像

使用预定义的高度、宽度和 (x , y) 索引保存在轨道中后自动裁剪图像

在浏览器中自动裁剪图像

扫描图像后自动裁剪

使用 Python 自动裁剪图像

c# 自动裁剪图像