我有一个非白色区域的图像(例如段落但不处理OCR).这些区域之间的空间有些规律,观看图像的人将能够看到这些区域之间存在白色空间.
我打算做的是找到所有区域的顶角和底角,从底角开始到下一个区域的顶角,获取每条水平线的熵,以及具有最小值的线并返回该线的Y位置.
[region] <--- maximum corner coordinates identified
[line with lowest entropy] <--- return Y position starting from above region's bottom corner's Y coordinate.
[region]<--- stop at Y coordinate of this region's top corner.
Run Code Online (Sandbox Code Playgroud)
我打算做的是裁剪这些地区.
我想到的另一种方法是使用直方图来识别最低点并以某种方式找到最低点的位置.
我不确定这是否是您要找的(我不确定您要找的是什么),所以如果我错了,请写更多详细信息,我会尝试更新我的答案。现在我认为你正在寻找白色区域,这最适合分割纸张,因为你没有剪切任何重要的东西。
最容易实现的解决方案就是计算每行和下一行的总和,并检查这些值的差值是否为 0(或其他小值)。这是一个简单的代码:
Mat m = imread(pathToFile);
cvtColor(m, m, CV_BGR2GRAY); //just to make sure
for (int i = 0; i < m.rows - 1; i++)
{
Scalar s = sum(Mat(m, Rect(0, i, m.cols - 1, 1)));
Scalar s2 = sum(Mat(m, Rect(0, i + 1, m.cols - 1, 1)));
Scalar s3 = s - s2;
if ((int)s3[0] == 0)
printf("Empty line: %d\n", i);
}
Run Code Online (Sandbox Code Playgroud)
事实上 - 你还应该检查这条线是否是白色的,或者也许你刚刚发现了 2 条非常相似的非白色线 - 所以只需在这段代码中添加一些测试,例如if ((int)s[0] < someValue) {//it's ok} else {//it's bad}
. 当然,这不是非常有效的解决方案,因为您必须计算每行(几乎每行)的总和两次,这是浪费时间。更快的解决方案是记住变量中的行总和,或者如果您想稍后使用它们,甚至可以将所有总和放入向量/数组/等中。
计算此值的最有效方法可能是使用积分图像- 计算整个图像的总和,然后i
从行的最后一个元素中减去行的最后一个元素i+1
。当然积分图像是在 openCV 中实现的 -请参阅此处
归档时间: |
|
查看次数: |
1057 次 |
最近记录: |