如何区分照片和文字图像

Posted

技术标签:

【中文标题】如何区分照片和文字图像【英文标题】:How to distinguish photo from text image 【发布时间】:2011-10-15 18:19:14 【问题描述】:

我正在编写 OCR 识别程序。它适用于扫描文本,但是有两个问题:

    它会在照片上产生误报(一些垃圾随机文本,例如“bkigopes”) 运行速度很慢

目标是找到所有带有文本的图像并提取此文本。所以,鉴于提到的问题,我需要快速拒绝照片。我希望有一些数学(统计)方法,比如计算一些中位数,可以很容易地确定彩色图像,而不像扫描文本那样有明显的结构。

这种方法/公式不应被特殊类型的图像所欺骗,例如带有屏幕截图的文本或带有大量文本和图片的杂志页面。此外,不应拒绝彩色文本(例如黄底红字)。

有没有人遇到过这样的问题?有什么想法或现成的解决方案吗?

【问题讨论】:

【参考方案1】:

在这方面没有任何先验知识/经验,但作为一个完整的猜测:

熵计算会起作用吗?

如果某物具有高熵,那么它很可能是图像;如果较低,则可能更像是文本。

希望能有所帮助...

【讨论】:

感谢您的快速想法。我想这可能有效(但不确定这是否会被杂志文章欺骗)。你有实现这种计算的链接吗? @Alex:不!我什至对数学都不太熟悉(!),这只是一个突然出现在我脑海中的想法。 :) 我的理由是文本组织良好,而图像则相当随机,因此计算熵可能是个好主意。 大声笑,你好 Mehrdad。我认为这不适用于 OCR 应用程序,因为文本存储为图像。如果您之前扫描过文档,您会注意到压缩量(与熵有关)并没有异常高。 大声笑,嘿@tskuzzy。嗯...我不确定我明白你的意思。我确实意识到文本存储为图像(这是问题的重点......)但我认为文本是在浅色(白色/灰色),所以我想它的信息内容(因此熵)比图像的信息内容低很多。为什么不是这样? @Mehrdad:这适用于普通照片。但是高对比度的黑白照片呢?另外你是如何计算熵的?使用亮度?【参考方案2】:

总的来说这是一项相当艰巨的任务。但是,考虑到您的特定应用程序,也许您可​​以对 OCR 程序的输入做出假设。

您提到了“扫描文本”。所以我假设这不会应用于道路上的公告牌图片,并且需要在风景背景中识别公告牌上的文字。这意味着颜色范围低而对比度高。

另一方面,照片通常具有非常大的颜色范围,相邻像素之间的对比度相对较低。当然,考虑到多种摄影风格,这个假设很容易失效。

所以我认为您可以尝试的第一件事是将图像转换为黑白(不是灰度)。然后看两种颜色的相对比例。我认为照片将比扫描文档更均匀地分割。您用于转换照片的算法应该能够抵抗异常值,因此使用某种中值作为阈值可能会很好。

【讨论】:

小心高通滤波(第 3 段)。您的假设是文本只有几个像素宽——这可能是真的,也可能不是。如果它有点粗体,你会得到文本的大纲,而不是正文......所以它可能会变得更棘手。 感谢您的建议,tskuzzy。我认为图片的任何更改都会对大图片产生重大的性能损失。我必须想出一些数学方法。你怎么看直方图?对于文本,它应该有两个最大值。但是,我不确定里面的文字+图片。【参考方案3】:

首先,由于杂志页面是混合的,因此您不会找到一种可以拍摄整个图像并做出判断的单一技术。将需要某种细分。如果是我,我会在水平和垂直方向寻找显示低方差的像素带,然后使用它们将图像划分为网格。然后您可以测试网格中的每个单元格并删除那些是照片的单元格。

现在进行照片测试。就像@Mehrdad 的熵方法一样,您可以尝试对这样的任务进行压缩。不同的压缩算法工作方式不同,但无损 Lempel-Ziv-Welch 风格或等效压缩算法应该比照片压缩更多的文本图像。测量未压缩版本和压缩版本之间的大小差异可以很好地估计熵。毕竟,熵是衡量最佳无损压缩的标准。通过一些经验工作,这可以提供一种相当可靠的分类技术。

【讨论】:

感谢您的建议,morungos。我认为图片的任何更改都会对大图片产生重大的性能损失。我必须想出一些数学方法。

以上是关于如何区分照片和文字图像的主要内容,如果未能解决你的问题,请参考以下文章

人脸识别系统如何区分真人脸和人脸照片?

java 如何区分一代二代身份证照片

如何区分对象文字和其他 Javascript 对象?

怎么用照片人脸识别

基于场景文字的多模态融合的图像分类

如何区分二值图像和灰度图像?