gpt4 book ai didi

opencv - 识别 Talmud 页面上的文本区域

转载 作者:行者123 更新时间:2023-12-02 15:26:01 26 4
gpt4 key购买 nike

我有一个像这样的 Talmud 页面:
enter image description here
enter image description here
我想用 opencv 找到文本区域为了得到这样的结果,每个文本都将像这样独立存在:
enter image description here
在附图中,每个区域用不同的颜色标记,并且文本有一个数字,重要的是识别属于每个文本的区域,并将其与属于另一个文本的区域区分开来,数字顺序无关紧要.
用眼睛做真的很容易,根据文本之间的白色条纹,但我试图用opencv来做。我不能。
在下面的代码中,我尝试捕捉所有字母并将它们变成黑色矩形,
然后放大每个矩形以与相邻的矩形相遇,
因此文本的整个区域将是黑色的,并且文本之间将有一条清晰的白色条纹。
我不知道如何进行,以及它是否是一个好方法。

public List<Rectangle> getRects(Mat grayImg)
{
BlobCounter blobCounter = new BlobCounter();
blobCounter.ObjectsOrder = ObjectsOrder.None;
blobCounter.ProcessImage(grayImg);
IEnumerable<Blob> blobs = blobCounter.GetObjectsInformation();

var blackBlobs = grayImg.Clone;
foreach (var b in blobs)
blackBlobs.Rectangle(b.Rectangle.ToCvRect, Scalar.Black, -1);

var widths = blobs.Select(X => X.Rectangle.Width).ToList;
widths.Sort();
var median = widths(widths.Count / (double)2);

Mat erodet = new Mat();
Cv2.Erode(grayImg, erodet, null, iterations: median);

using (Window win = new Window())
{
win.ShowImage(erodet);
win.WaitKey();
}
}
提前致谢,任何帮助将不胜感激。
补充说明:
如上图所示,文本区域不是矩形,
但是这些区域可以被描述为一组不同大小的矩形排列成一堆,一个叠一个。
请注意,当两个矩形属于同一个文本时,不要将一个矩形与另一个矩形相邻排列,而只能将一个矩形放在另一个矩形之上。
我想要实现的是这些矩形的集合,并知道每个矩形属于哪个文本。
答案可以是任何编程语言,尤其是在 C++PythonC#

最佳答案

我相信这项任务主要可以使用 morphological operations 来完成。 .
中更容易展示这个概念,但是 有等价的操作。
我们首先粗略估计页面不同部分之间的差距大小。查看您的示例,该间隙约为页面高度的 1%。

img = im2single(rgb2gray(imread('/image/LoV5x.jpg')));  % read the image into 1ch gray scale image in range [0, 1]
gap = ceil(size(img,1) * 0.01); % gap estimation
首先,我们想使用图像 dilation创建一个掩码,其中同一部分中的所有单词都相互连接:
d1 = imdilate(img < 0.5, ones(gap));
结果是:
enter image description here
(如果不是因为打印机在每个部分的底部添加了下一页的烦人的话,我们早就完成了......)
有一些大的空白没有被扩张填补,我们可以使用 floodfill 完成它们:
f = imfill(d1, 'holes');
现在我们有文本区域的完整掩码:
enter image description here
使用 erosion在不同的部分之间进行切割:
e = imerode(f, ones(1, 5*gap));  % erosion only horizontally
产生正确的分区,虽然太细了:
enter image description here
向后扩张
d2 = imdilate(e, ones(1, 5*gap));
给出这个二进制掩码:
enter image description here
您现在可以简单地查看 connected components这个二进制掩码的:
enter image description here
我希望这对我来说算作“Daf Yomi”...

更新:
下一步 - 从线段到矩形多边形需要一些几何运算,我将在此处概述该方法并将实现细节留给您。
最终,我们想要一个边界 polygon对于每个线段,基本多边形是线段的矩形边界框。你必须实现这个“多边形”类。此类的一个关键方法是“多边形减法” - 即 poly_result = poly_a - poly_b创建一个新的多边形 poly_result这是 poly_a减去 poly_a 之间的交集和 poly_b .
这是算法:
  • 对于每个段,计算它的边界框、边界框的面积和段中的实际像素数。
    将每个线段的多边形初始化为其边界框。
  • 根据像素数与边界框区域之间的比率按降序对段进行排序。
  • 对于按降序排列的每个分割市场:
    从此线段中减去所有先前的多边形。

  • 你应该得到这样的东西:
    enter image description
    对于第二张图片:
    enter image description

    关于opencv - 识别 Talmud 页面上的文本区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63865237/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com