sbi*_*sbi 19 algorithm image-processing
因此,我们需要检测由扫描仪创建的图像是否代表空白页面.在图像处理方面,我已经超出了我的深度,所以我必须由社区运行.
这是我到目前为止所提出的:
空页可以是明显的白色,灰色再生纸或泛黄的旧纸.目前的想法是为页面创建直方图,寻找曲线的急剧增加,并使像素的百分比比这更暗.如果超过阈值,页面可能不为空.
由于这可能会将包含顶部单行文本的页面分类为空,我们会平铺页面并收集有关每个图块的统计信息.
我们需要从绑定中检测扫描的订书机和孔(可能只在某些图块中),但这可以推迟到稍后阶段.但是,如果你知道除了这两个之外还要注意什么,请在评论中提及.
这需要很快.它是文档处理工作流程的一部分,每天处理(数十万)页面.如果处理页面的时间要长十秒,那么我们的客户将不得不告诉他们的客户他们将需要等待几天才能获得结果.(如果这导致更多的误报,一些客户宁愿让某人检查几十个被发现的"空"页面,而不是让他们的客户再等一天.)
所以这是我的问题:
采取这条路线是不是一个好主意,还是有更好的东西?
如果我们这样做,我该怎么做?找到页面阈值的好(便宜)算法是什么?我们可以通过为一批文件假设一个类似的门槛来获得显着的速度吗?在记录之前,亮度值可以精确到哪个精度值?我们可以期待什么怪癖?
如果您知道扫描的页面将完全填充图像,那么计算标准差可能是实现此目的的好方法。
我建议稍微模糊页面以减少一些噪音。然后计算页面的SD,理论上,或多或少都是一种颜色的页面将具有较低的SD,而包含大量文本的页面将具有较高的SD。然后是“训练”系统来计算页面何时是纯文本以及何时是文本的情况。您可能会发现某些页面很难分辨。
你可以通过让它处理大量页面来训练它,它会遍历所有页面,然后你说它是否简单。
编辑
好的,带有黑色文本的白色页面,如果我们只有页面而没有周围的东西,则将具有平均的灰色,可能是相当浅的灰色。获取平均值是通过所有像素进行 for 循环,将它们的值相加,然后除以像素数。我不擅长这种 o(logN) 的东西,但足以说,它不会那么长。除非你有巨大的图像。
SD 是第二个 for 循环,这次我们计算每个像素与平均值的差异,然后除以平均值。这将比平均值花费更长的时间,因为我们必须做类似的事情
diff = thispixel - mean;
if(diff < 0) {
diff = -diff;
}
runningTotal += diff;
Run Code Online (Sandbox Code Playgroud)
对于纯色页面,每个像素都会接近平均值,因此我们的 SD 会很低。如果 SD 低于某个值,我们可以假设这意味着页面都是一种颜色。
如果文本量非常小,这可能会出现问题,因为它不会对 SD 产生很大影响,所以也许像您在问题中建议的那样,将页面分成几个部分。我建议水平条带,因为文本往往是这样的。如果我们一次只做其中一个条带,一旦其中一个条带显示有文本,我们就可以停止,因为我们不在乎其余的条带是否为空白。
模糊页面将有助于减少噪点,因为噪点的奇数像素的影响将减少,从而为您提供“更严格”的标清。您还可以使用它来降低图像的分辨率。
假设您的酱汁图像是 300 宽 x 900 高,您可以以 9 个 3 *3 的块对像素进行采样,从而最终得到一个 100 宽 x 300 高的图像,因此它实际上可以用于减少您需要进行的计算,在本例中是九分之一!
主要问题是计算出一张普通页面的 SD 可以达到多高。也许让它找到一堆空白页的 SD。
听起来,你可能会想要一个中间立场,让它不确定并要求人为干预,可能让人类价值训练系统变得更好?
| 归档时间: |
|
| 查看次数: |
5643 次 |
| 最近记录: |