我有一个二进制文件,在图像的不同部分有一些文字,如底部,顶部,中间,右中间等等。
原始图片
我想关注的区域是手动绘制的区域,以红色显示。
我计算了图像的水平和垂直总和并绘制了它们:
plot(sum(edgedImage1,1))
plot(sum(edgedImage1,2))
有人可以向我解释这些情节告诉我的内容关于我上面解释过的结构的原始图像吗? 而且,这些情节怎么能帮我提取那些我只是手动用红色绘制的区域?
答案 0 :(得分:2)
总和操作并不复杂。简而言之,sum(edgedImage1,1)
计算图像中每列的所有行的总和,这就是您正在绘制的内容。实际上,您计算每列所有行的所有非零值(即白色像素)的总和。图中的水平轴表示您正在观察的行总和。同样,sum(edgedImage,2)
计算图像每一行的所有列的总和,这就是您正在绘制的内容。
由于您的文字以横向方式显示,因此sum(edgeImage,1)
不会特别有用。最有用的是sum(edgedImage,2)
操作。对于图像中空白的行,图像每行的水平列总和应该是非常小的值,而对于图像中包含文本或笔划的行,总和应该非常大。我所谈论的一个很好的例子就是你的形象的底部。如果在第600行和第700行之间进行协商,则会看到绘图中出现巨大的峰值,因为这些行之间存在大量文本。
使用此结果,确定图像中包含文本或笔划的区域的粗略方法是查找超过某个阈值的所有行。结合从刚刚执行的求和操作中查找模式或峰值,您可以非常轻松地定位和分离每个文本区域。
如果您决定确定有多少文本blob,您可能希望平滑sum(edgedImage,2)
提供的曲线。平滑此信号后,您将清楚地看到有5种模式对应5行文本。
答案 1 :(得分:1)
显示每行总和的第二个图。这可以告诉您哪些行有很多信息,哪些行没有。
您可以使用此图来查找矩形,方法是在矩形开始的值中查找急剧倾斜,并使矩形末端的值急剧下降。在你这样做之前,我会低通过滤数据,然后看看它的衍生物并寻找一个很大的衍生物。
你可以对第一个情节做同样的事情,但它更敏感。
答案 2 :(得分:1)
上一个图中的最小值是文本行之间的间隙......
您只需获取图表并将其y
轴与y
轴对齐,然后将每个像素的像素数量过小的阈值区域对齐。这些区域(红色)是文本行之间的间隙或图像上的任何内容:
现在,如果需要,您应该对图像进行去偏斜。如果偏斜太大,则需要在y
轴求和之前应用去偏斜。
在此之后,分别为每个非红色区域制作x
轴总和图,并以相同的方式检测字符/单词之间的间隙,以获得OCR的每个字符的区域。这次你对齐x
轴
如果在字符区域上使用这些图也可以用于OCR而不是参见
如果对间隙/非间隙尺寸进行统计分析,那么最经常的间隔通常是常规文本的字体间距/大小。