使用 ImageMagick 删除收据图像边框

Posted

技术标签:

【中文标题】使用 ImageMagick 删除收据图像边框【英文标题】:Remove receipt image border using ImageMagick 【发布时间】:2015-03-04 03:00:48 【问题描述】:

在使用 tesseract-OCR 引擎提取文本之前,我使用 ImageMagick 服务对收据图像进行预处理。我需要删除收据的背景。我已经通过遮罩去除了边框 here. 但我无法为收据创建遮罩。

但是,我尝试从收据图像中移除阴影。

初始图像(收据示例)

convert input.png -colorspace gray \
      \( +clone -blur 0x2 \) +swap -compose divide -composite \
      -linear-stretch 5%x0%   photocopy.png

代码应用后:

我已尝试使用下面的代码将除白色以外的所有颜色变为黑色,但这似乎并没有完全遮盖 photocopy.png 的背景。

convert receipt.jpg -fill black -fuzz 20% +opaque "#ffffff" black_border.jpg

有什么办法可以去掉收据图片的边框吗?或者从图像中创建任何类型的蒙版?注意:我需要为具有不同背景的多个图像去除噪点和边框。

【问题讨论】:

【参考方案1】:

回答你的问题

“有什么方法可以去除收据图像的边框?或者从图像中创建任何类型的蒙版?

以下命令(基于您自己的代码)将创建一个图像,您可以使用它来导出适用蒙版的尺寸:

convert                     \
   origscan.jpg             \
  -colorspace gray          \
   \( +clone 0 -blur 0x2 \) \
  +swap                     \
  -compose divide           \
  -composite                \
  -linear-stretch 5%x0%     \
  -threshold 5%             \
  -trim                     \
   mask-image.png

您可以使用该遮罩图像创建单色(黑色)遮罩——在一个命令中:

convert                     \
   origscan.jpg             \
  -colorspace gray          \
   \( +clone 0 -blur 0x2 \) \
  +swap                     \
  -compose divide           \
  -composite                \
  -linear-stretch 5%x0%     \
  -threshold 5%             \
   \(                       \
      -clone 0              \
      -fill '#000000'       \
      -colorize 100         \
   \)                       \
  -delete 0                 \
   black-mask.png

下面是上面两个命令的结果,并排显示:

您可以使用identify 获取mask-image.png 以及black-mask.png 的几何形状:

identify -format "%g\n" *mask*.png
  2322x4128+366+144
  2322x4128+366+144

所以图像画布是 2322 像素宽和 4128 像素高。在我们的-trim 操作之后,两个图像的可见部分当然更小。 (+366+144 部分表示与原始图像左上角的水平/垂直偏移。)


附加评论: 说了这么多:您真的应该考虑从收据中创建更好的照片! (如果您的相机可以创建 4128 像素高度的图像,这应该不是问题。如果您有这么多的收据要处理,那么购买一个小玻璃板可能是个好主意,您可以放在纸上,以便在拍照时将其拉直...)

【讨论】:

用其他图像尝试了您的代码,但 -trim 似乎不适用于背景较暗的图像。我尝试更改阈值,但不同的图像需要不同的阈值。您能否建议任何其他删除边框的方法。最近,我发现 SWT 'Stroke Width Transform' 可以识别自然图像中的文本。这可以通过 imagemagic 以某种方式找到文本区域并删除其他部分吗?提前致谢。【参考方案2】:

如果在类 unix 系统上使用 ImageMagick,您可以尝试我的文本清理器脚本。

textcleaner -f 20 -o 10 -e normalize UhSV6.jpg result.jpg

【讨论】:

以上是关于使用 ImageMagick 删除收据图像边框的主要内容,如果未能解决你的问题,请参考以下文章

当图像内部存在背景颜色(不仅仅是边框)时,Imagemagick trimimage功能也会修剪

从图像中删除所有空白区域

设置ImageMagick PNG图像背景颜色

ImageMagick 无法在 WSL 上将 PDF 转换为图像

使用 ImageMagick 绘制居中矩形

ImageMagick - 沿内部非透明对象边框分割透明度图像