【发布时间】:2020-09-12 21:50:49
【问题描述】:
我有一个像这样的塔木德页面:
我想找到带有opencv 的文本区域以获得这样的结果,每个文本都将像这样独立:
在附图中,每个区域用不同的颜色标记,并且文本有一个数字,重要的是识别每个文本所属的区域,并将其与属于另一个文本的区域区分开来,数字顺序没关系。
根据文字之间的白色条纹,用眼睛做真的很容易,但我尝试用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++ Python 和C#
【问题讨论】:
-
我不会在第一遍寻找矩形,我会寻找白线。查看如何进行光学过滤并找到一个将文本块识别为灰色但能够拾取空白区域的一维过滤器。沿每个方向扫描页面(例如,以每个字符高度 3 或 4 次扫描的频率)并构建由空白分隔的灰色斑点模型。这将需要一些试验和错误才能正确。如果页面没有很好地对齐(就像你展示的那样),那将会更加困难。如果是这样,您可能首先想做一些事情来弄清楚对齐方式,然后预先旋转一些东西
-
你可以试试形态学操作erode。 kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(19,8)) out = cv2.morphologyEx(thresh, cv2.MORPH_ERODE, kernel)
标签: opencv image-processing computer-vision ocr image-segmentation