2017-04-04 34 views
0

我有一个文档 - 比如说一个ID的后面和前面。像这样的 The dotted lines are that of a poorly scanned ID, so the borders are not clear 目标是检索图像1和图像2作为两个单独的图像。扫描的文件是黑色和白色。从图像中获取两张图像,其中两张图像粘贴在单个文档中 - Python/C++

我的问题: 1.这是否可行? 2.任何想法/代码片断如何继续将不胜感激。

在此先感谢,

+0

合适的图像可能会引起一个更好的答案。 –

+0

@MarkSetchell将获得一个适当的代表性的形象,不能上传的实际图像为隐私的原因 –

+0

优秀!这样可以更清晰地显示分辨率和尺寸,噪音量,分离度和颜色 - 只是模糊或变黑最敏感的部件,但会尽可能多地留下图案和边框/环绕声。 –

回答

0

由于您还没有提供和图片...我会提供一些样品。我正在使用ImageMagick,因为您可以在命令行执行此操作,而无需编译任何内容,但您可以在Python中使用OpenCV中完全相同的技术。

所以,这里是一个示例图像。

enter image description here

现在,扫描可能有噪音,它可能没有纯粹的白人和黑人,如果没有正确的曝光,所以作为第一步,可以正常化或自动水平的图像,其阈值,以纯黑色和白色,并应用中值滤镜去除噪点 - 特别是如果它是JPEG。

convert scan.jpg -normalize -threshold 90% -median 9x9 -negate result.png 

enter image description here

也许你现在要关闭孔使用一些形态:

​​

enter image description here

现在你可以做一些“连接成分分析”找到斑点:

convert scan.jpg -threshold 90% -median 9x9 -negate \ 
    -morphology close disk:7       \ 
    -define connected-components:verbose=1   \ 
    -connected-components 8 -auto-level result.png 

样本输出

Objects (id: bounding-box centroid area mean-color): 
    0: 695x297+0+0 355.4,150.9 107426 srgb(0,0,0) 
    2: 276x188+352+54 487.8,148.7 50369 srgb(255,255,255) 
    1: 275x194+43+44 185.9,143.3 46695 srgb(255,255,255) 
    3: 78x47+56+56 96.4,72.9 1731 srgb(0,0,0) 
    4: 18x16+168+183 176.5,190.4 194 srgb(0,0,0) 

,给出了一个“标记为”形象,我们实际上并没有打算使用,但识别每个斑点它以连续较淡发现。

enter image description here

现在看文本输出上面,你可以看到有5个斑点 - 每行一个。您可以检查第四个字段,它是blob的区域,第五个字段是颜色 - 这将有助于区分黑色和白色斑点。让我们来看看一对夫妇的斑点,并吸引他们在原始图像上:

convert scan.jpg -fill "rgba(255,0,0,0.5)" -draw "rectangle 352,54 628,242" result1.png 

enter image description here

convert scan.jpg -fill "rgba(255,0,0,0.5)" -draw "rectangle 43,44 318,238" result2.png 

enter image description here

现在我们可以砍下个人网页出来:

convert scan.jpg -crop 276x188+352+54 doc1.png 

enter image description here

convert scan.jpg -crop 275x194+43+44 doc2.png 

enter image description here

0

您可以尝试findContours。

findContours (image, contours, hierarchy,     
       CV_RETR_EXTERNAL,    
       CV_CHAIN_APPROX_SIMPLE, 
       Point(0, 0)); 

然后使用drawContours来查看是否选择了所需的图像。 您可以找到轮廓的边界框,而不必担心错误的扫描。 如果这不起作用,尝试预处理您的图像,你可以尝试变形,阈值等。

我希望这有助于!

+0

我认为这是OpenCV。将来,请确定正在使用的代码。 – fmw42

1

马克·瑟特查问我告诉我的剧本,multicrop2,这确实像他的所有命令的东西他的榜样。见http://www.fmwconcepts.com/imagemagick/multicrop2/index.php

我注意到他的图像周围有一个黑色边框。所以我需要先用Imagemagick刮脸去除它,然后将它传递给我的脚本multicrop2。

convert vZiPW.jpg -shave 3x3 miff:- | multicrop2 -u 1 -f 1 -m save -d 10000 vZiPW_shaved.png multicrop_results.jpg 

在脚本中,我使用-u 1来进行去斜角来旋转提取的图像。我使用-f 1(模糊值或1%的容差)以允许在填充期间将JPG压缩更改为背景白色以制作遮罩。我还保存了我的脚本首先提取的掩码来定位两个图像。由于图像的颜色接近白色,因此可能会有小孔或斑点。所以我的脚本将使用连接的组件进程来填充这些洞。因此,它忽略了任何区域,其面积小于10000像素,如-d 10000所示。更重要的是,它使用连接的组件来定位来自掩码的两个大区域的边界框,然后裁剪和不旋转来自输入图像。

这里是一个floodfill操作后的原始掩模和所连接的部件的处理之前除去小斑点:

enter image description here

下面是抗扭斜unrotation后的两个提取的图像。

enter image description here

enter image description here

+0

感谢您分享! –

+0

优秀的作品,弗雷德!谢谢。请保留答案,以便我们都可以分享和学习。 –