问题内容
,我是 opencv 新手,也是 python 新手。我尝试将在网上找到的代码拼接在一起来解决我的研究问题。我有一本 1870 年的阿拉伯语日记,有数百页,每页都包含两栏,并有粗黑边框。我想将两列提取为图像文件,以便分别对它们运行 ocr,同时忽略页眉和页脚。下面是一个页面示例:,第 3 页,我有十页原始打印作为单独的 png 文件。我编写了以下脚本来处理每一个。它在 10 页中的 2 页中按预期工作,但无法在其他 8 页中生成列。我对所有函数的理解不够深入,无法知道我可以在哪里使用这些值,或者我的整个方法是否被误导了 -我认为最好的学习方法是询问社区您将如何解决这个问题。,按照教程,我创建了一个模糊和扩张的二元反转,以便它可以通过大的白色区域来识别不同的矩形区域。我还保存了每个扩展版本的副本,以便我可以看到它的样子,这是处理后的上面的页面:,第 3 页已放大,“for c in cnts”循环应该找到图像中的大矩形区域。如果高宽比小于 2.5,我会得到一个完整的页面(没有页眉和页脚,这效果很好),如果高宽比大于这个,我知道它是一个列,并且它保存了这个例如 temp/p2-col2.png,我得到了一些漂亮的完整页面,没有页眉和页脚,也就是说,只有较大的黑色边框,但没有被切成列。在 10 页中的 2 页中,我得到了我想要的内容,即:,第 2 页的成功专栏,由于我有时会得到所需的结果,因此一定有某些东西正在起作用,但我不知道如何进一步改进它。,编辑:,以下是更多页面示例:,p0,p1,p5,我尝试了一些没有任何扩张的东西,因为我想看看是否可以只使用中间线作为“分隔符”。这是代码:,我没有使用任何有关宽高比的断言,所以也许这仍然是您需要做的事情..,基本上,这种方法中最重要的线条是基于 x 坐标生成左轮廓和右轮廓。这是我得到的最终结果:,边缘仍然有一些黑色部分,但对于 ocr 来说这应该不是问题。,仅供参考:我在 jupyter 中使用以下软件包:,v2.0:仅使用大框检测来实现:,所以我做了一些扩张,这个大盒子很容易被检测到。我使用水平内核来确保大盒子的垂直线始终足够粗以被检测到。然而,我无法解决中间线的问题,因为它非常细……尽管如此,这里是上述方法的代码:,这些是结果,您可以注意到它并不完美,但同样,由于您的目标是 ocr,这应该不是问题。,请告诉我这是否可以,如果不行,我会绞尽脑汁寻找更好的解决方案……,v3.0:一种获得更直图像的更好方法,这将提高 ocr 的质量。,受到我在这里的另一个答案的启发:answer。拉直图像是有意义的,这样 ocr 就有更好的结果。因此,我在检测到的外框上使用了四点变换。这将使图像稍微变直,并使文本更加水平。这是代码:,具有以下软件包:,正如您从代码中看到的,这是一种更好的方法,由于四点变换,您可以强制图像居中且水平。此外,不需要包含一些重叠,因为图像分离得很好。这是一个供您参考的示例:,