opencv – 如何检测文档图像上的边缘,并将切片切割成单独的图像?

任务是拍摄文档的图像,并利用围绕不同“部分”的直线,以便将图像分割成不同的文档以进行进一步的解析.不同“部分”的大小在页面之间完全不同(我们处理的是几千页).以下是这些图像之一的图像:

文件如何布局的示例:

《opencv – 如何检测文档图像上的边缘,并将切片切割成单独的图像?》

图像分析/操作对我来说是全新的.到目前为止,我已尝试使用Scikit图像边缘检测算法来查找“框”,希望使用这些“坐标”来剪切图像.然而,我尝试过的两种算法(Canny,Hough)在高灵敏度下拾取文本行作为“边缘”,而不是在低灵敏度下拾取我想要的行.我可以写一些自定义和低级别的东西来自己检测盒子,但我必须假设这是一个已解决的问题.

我的方法是朝着正确的方向前进吗?谢谢!

最佳答案 您似乎没有获得任何OpenCV答案,因此我尝试使用ImageMagick,只需在命令行的终端中. ImageMagick安装在大多数Linux发行版上,可免费用于macOS和Windows.该技术很容易适应OpenCV,因此如果它适合您,您可以将其移植到其中.

我的第一步是做一个5×5盒式滤镜和80%的阈值,以消除扫描伪像然后反转(可能是因为我计划使用形态学,但最终没有).

convert news.jpg -depth 16 -statistic mean 5x5 -threshold 80% -negate z.png

《opencv – 如何检测文档图像上的边缘,并将切片切割成单独的图像?》

然后我通过“连接组件分析”运行它,并丢弃所有面积太小(小于2000像素)的blob:

convert news.jpg -depth 16 -statistic mean 5x5 -threshold 80% -negate  \
   -define connected-components:verbose=true                           \
   -define connected-components:area-threshold=2000                    \
   -connected-components 4 -auto-level output.png

产量

Objects (id: bounding-box centroid area mean-color):
  110: 1254x723+59+174 686.3,536.0 901824 srgb(0,0,0)
  2328: 935x723+59+910 526.0,1271.0 676005 srgb(0,0,0)
  0: 1370x1692+0+0 685.2,712.7 399651 srgb(0,0,0)
  2329: 303x722+1007+911 1158.0,1271.5 218766 srgb(0,0,0)
  25: 1262x40+54+121 685.2,140.5 49820 srgb(255,255,255)
  109: 1265x735+54+168 708.3,535.0 20601 srgb(255,255,255)
  1: 1274x64+48+48 675.9,54.5 16825 srgb(255,255,255)
  2326: 945x733+54+905 526.0,1271.0 16660 srgb(255,255,255)  
  2327: 312x732+1003+906 1169.9,1271.5 9606 srgb(255,255,255)  <--- THIS ONE
  421: 403x15+328+342 528.6,350.1 4816 srgb(255,255,255)
  7: 141x23+614+74 685.5,85.2 2831 srgb(255,255,255)

字段在第一行标记,但有趣的是第二行(块几何)和第四字段(blob区域).如您所见,有11行,因此它在图像中找到了11个斑点.第二个字段AxB C D表示一个矩形A像素宽,B像素高,其左上角C像素位于图像的左边缘,D像素位于顶部.

让我们看一下我用箭头标记的那个,它开始于2327:312×732 1003 906并在那个上绘制一个矩形:

convert news.jpg -fill "rgba(255,0,0,0.5)" -draw "rectangle 1003,906 1315,1638" oneArticle.png

《opencv – 如何检测文档图像上的边缘,并将切片切割成单独的图像?》

如果要将该文章裁剪为新图像:

convert news.jpg -crop 312x732+1003+906 article.jpg

《opencv – 如何检测文档图像上的边缘,并将切片切割成单独的图像?》

如果我们绘制所有其他框,我们得到:

《opencv – 如何检测文档图像上的边缘,并将切片切割成单独的图像?》

点赞