1

我想通过OCR(可能是Tesseract)运行一些小图像/精灵并从中提取一个或多个数字,我知道这些数字/单词将具有特定的颜色(假设是嘈杂/彩色背景上的白色) .

在阅读有关 OCR 预处理图像的信息时,我认为从图像中删除所有非白色的东西会非常有益。

我正在使用两者imagemagickvips但我不知道从哪里开始,使用什么操作以及如何搜索它。

4

4 回答 4

3

如果我们制作这样的示例图像:

magick -size 300x100 xc: +noise random -gravity center -fill white -pointsize 48 -annotate 0 "Hello" captcha.png

在此处输入图像描述

然后你可以用黑色填充任何不是白色的东西:

magick captcha.png -fill black +opaque white result.png

在此处输入图像描述

如果你想接受接近白色的颜色为白色,你可以包括一些“绒毛”

magick captcha.png -fuzz 10% -fill black +opaque white result.png

在此处输入图像描述

在此处输入图像描述

于 2020-08-07T09:59:14.693 回答
2

几个月前有一个关于 libvips tracker 的讨论关于背景去除的技术:

https://github.com/libvips/libvips/issues/1567

这是过滤器:

#!/usr/bin/python3

import sys 
import pyvips

image = pyvips.Image.new_from_file(sys.argv[1], access="sequential")

# aim for 250 for paper with low freq. removal
# ink seems to be slightly blueish
paper = 250
ink = [150, 160, 170]

# remove low frequencies .. don't need huge accuracy
low_freq = image.gaussblur(20, precision="integer")
image = image - low_freq + paper

# pull the ink down
ink_target = 30
scale = [(paper - ink_target) / (paper - i) for i in ink]
offset = [ink_target - i * s for i, s in zip(ink, scale)]
image = image * scale + offset

# find distance to white of each pixel ... small distances go to white
white = [100, 0, 0]
image = image.colourspace("lab")
d = image.dE76(white)
image = (d < 12).ifthenelse(white, image)

# boost saturation (scale ab)
image = image * [1, 2, 2]

image.write_to_file(sys.argv[2])

它去除低频(即纸张褶皱等),扩展对比度范围,在 CIELAB 中找到接近白色的像素并将它们移动到白色,并提高饱和度。

您可能需要针对您的用例对其进行一些调整。如果您需要更多建议,请发布一些示例图片。

于 2020-08-07T11:41:33.673 回答
1

我不是这方面的专家,但也许尝试将 RGB 值低于某个阈值的所有像素更改为黑色,或者删除它们?正如我之前提到的,我对这些都不是很了解,但我不明白为什么这不起作用。

于 2020-08-07T03:16:47.823 回答
0

如果图像是合成且未压缩的,您可以测试 RGB 值的严格相等性。否则,对 RGB 三元组(例如欧几里得或曼哈顿)之间的距离使用阈值。

如果您想允许亮度变化但不允许颜色变化,您可以转换为 HLS 并比较 HS。

于 2020-08-07T08:28:50.657 回答