我想通过OCR(可能是Tesseract)运行一些小图像/精灵并从中提取一个或多个数字,我知道这些数字/单词将具有特定的颜色(假设是嘈杂/彩色背景上的白色) .
在阅读有关 OCR 预处理图像的信息时,我认为从图像中删除所有非白色的东西会非常有益。
我正在使用两者imagemagick
,vips
但我不知道从哪里开始,使用什么操作以及如何搜索它。
我想通过OCR(可能是Tesseract)运行一些小图像/精灵并从中提取一个或多个数字,我知道这些数字/单词将具有特定的颜色(假设是嘈杂/彩色背景上的白色) .
在阅读有关 OCR 预处理图像的信息时,我认为从图像中删除所有非白色的东西会非常有益。
我正在使用两者imagemagick
,vips
但我不知道从哪里开始,使用什么操作以及如何搜索它。
如果我们制作这样的示例图像:
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
几个月前有一个关于 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 中找到接近白色的像素并将它们移动到白色,并提高饱和度。
您可能需要针对您的用例对其进行一些调整。如果您需要更多建议,请发布一些示例图片。
我不是这方面的专家,但也许尝试将 RGB 值低于某个阈值的所有像素更改为黑色,或者删除它们?正如我之前提到的,我对这些都不是很了解,但我不明白为什么这不起作用。
如果图像是合成且未压缩的,您可以测试 RGB 值的严格相等性。否则,对 RGB 三元组(例如欧几里得或曼哈顿)之间的距离使用阈值。
如果您想允许亮度变化但不允许颜色变化,您可以转换为 HLS 并比较 HS。