【问题标题】:Local Thresholding or Binarization of Text in an image图像中文本的局部阈值化或二值化
【发布时间】:2013-04-30 20:35:06
【问题描述】:

我正在开发一个应用程序来在不同的光照条件下提取 C# 中的文本。

我的问题是有时图像中存在不同的亮度级别,像这样:

所以我不能对整个图像使用预先计算的阈值,否则我会丢失一些字母。

我正在搜索算法/sn-p/函数或其他,可以将正确的阈值/二值化应用于图像。

我在 AForge 中创建了这个BradleyLocalThresholding,比其他非自适应方法要好,但它丢失了一些细节。 (比如图片中的G变成了O)

谁能给我建议一个更好的方法?

【问题讨论】:

  • 您是否尝试过使用“t”百分比?也许您可以尝试几个值并就它是什么字母使用共识。 声明:我从未做过任何真实的图像处理,只阅读了您发布的链接上的评论。
  • 我尝试过的最好的 t 值,大部分字母都很好,但是“G”变成了“O”(所以添加太多),“L”变成了“I” (所以减去太多)。我玩过窗口大小,但没有结果。

标签: c# image-processing ocr image-recognition aforge


【解决方案1】:

是的,使用 niblack(opencv 有它作为一个函数)——基本上它使用局部平均值来构造一个变量 theshold。它最适合 OCR。根据图像分辨率,您可能还希望在阈值处理之前将双三次上采样系数提高 2 倍或 3 倍。

【讨论】:

  • 嗨,你能说明一下 OpenCV 中的 niblack 或 bicubical upsamle 函数在哪里吗?我在网上搜索了它的文档,但没有结果。
  • cv::adaptiveThreshold() 使用 ADAPTIVE_THRESH_MEAN 类型并使用 cv::resize 和 INTER_CUBIC 类型调整大小
【解决方案2】:

这很困难,因为您的图像质量非常低,但您可以尝试如下迭代全局阈值方法:

  1. 随机选择一个初始估计阈值 T(通常作为平均值)。
  2. 使用 T 对信号进行分段,这将产生两组,G1 由所有值T 的点组成。
  3. 计算 G1 和 T 点之间以及 G2 和 T 点之间的平均距离。
  4. 计算新的阈值 T=(M1+M2)/2
  5. 重复步骤 2 到 4,直到 T 的变化足够小。

诀窍不是将其应用于整个图像,而是将图像分解为(例如)5x5 的块并将其单独应用于块,这将为您提供:

下面是 R 中的一个实现,我相信你可以重现

getT = 函数(y){ t = 平均值(y) mu1 = 平均值(y[y>=t]) mu2 = 平均值(y[y 1){ cmu1 = 平均值(y[y>=t]) cmu2 = mean(y[y 1 & cmu1 == mu1 & cmu2 == mu2){ 打印(粘贴('完成 t=',t)) 回报(t) 休息; }别的{ mu1 = cmu1 mu2 = cmu2 t = (mu1 + mu2)/2 打印(粘贴('新 t=',t)) } 我=我+1 } } r = seq(1, nrow(图像), by=5) c = seq(1, ncol(图像), by=5) r[长度(r)] = nrow(图像) c[长度(c)] = ncol(图像) y = 图像 for(i in 2:length(r) ){ for(j in 2:length(c) ){ 块 = 图像[r[i-1]:r[i], c[j-1]:c[j]] t = getT(块) y[r[i-1]:r[i], c[j-1]:c[j]] = (block>t)+0 } } 显示(y)

【讨论】:

  • 非常好的例子,但我认为对于强大的字符识别来说还不够。目前,我使用 BradleyLocalThreshold 获得的结果要好得多。
  • 还不错 :-) 图片质量这么低有什么原因吗?
  • 我同意,图像质量太低,通过更改捕获方法可能会更好。
【解决方案3】:

除了局部阈值之外的另一个选项是针对变化的照明进行调整。有一些方法试图校正照明并使其在整个图像中均匀。然后,您可以使用恒定阈值,或继续使用局部阈值,可能会取得更好的成功。如果图像与您展示的图像一样,那么您可以使用字母周围较亮的方块作为调整照明的关键。

【讨论】:

  • 照明校正也使用局部平均,因此与 niblack 没有什么不同,只是它需要一个额外的步骤。如果您要查找的唯一内容是 OCR 文本,那真的没有意义。
  • 照明可以应用于宏观视图,因为图像中的失真是渐进且连续的。它可以在应用自适应阈值之前以非均匀方式减少局部区域的方差。
猜你喜欢
  • 1970-01-01
  • 2017-02-17
  • 2012-02-19
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 2017-12-28
相关资源
最近更新 更多