我有一个文档 - 比如说一个ID的后面和前面。像这样的 The dotted lines are that of a poorly scanned ID, so the borders are not clear 目标是检索图像1和图像2作为两个单独的图像。扫描的文件是黑色和白色。从图像中获取两张图像,其中两张图像粘贴在单个文档中 - Python/C++
我的问题: 1.这是否可行? 2.任何想法/代码片断如何继续将不胜感激。
在此先感谢,
我有一个文档 - 比如说一个ID的后面和前面。像这样的 The dotted lines are that of a poorly scanned ID, so the borders are not clear 目标是检索图像1和图像2作为两个单独的图像。扫描的文件是黑色和白色。从图像中获取两张图像,其中两张图像粘贴在单个文档中 - Python/C++
我的问题: 1.这是否可行? 2.任何想法/代码片断如何继续将不胜感激。
在此先感谢,
由于您还没有提供和图片...我会提供一些样品。我正在使用ImageMagick,因为您可以在命令行执行此操作,而无需编译任何内容,但您可以在Python中使用OpenCV中完全相同的技术。
所以,这里是一个示例图像。
现在,扫描可能有噪音,它可能没有纯粹的白人和黑人,如果没有正确的曝光,所以作为第一步,可以正常化或自动水平的图像,其阈值,以纯黑色和白色,并应用中值滤镜去除噪点 - 特别是如果它是JPEG。
convert scan.jpg -normalize -threshold 90% -median 9x9 -negate result.png
也许你现在要关闭孔使用一些形态:
现在你可以做一些“连接成分分析”找到斑点:
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)
,给出了一个“标记为”形象,我们实际上并没有打算使用,但识别每个斑点它以连续较淡发现。
现在看文本输出上面,你可以看到有5个斑点 - 每行一个。您可以检查第四个字段,它是blob的区域,第五个字段是颜色 - 这将有助于区分黑色和白色斑点。让我们来看看一对夫妇的斑点,并吸引他们在原始图像上:
convert scan.jpg -fill "rgba(255,0,0,0.5)" -draw "rectangle 352,54 628,242" result1.png
convert scan.jpg -fill "rgba(255,0,0,0.5)" -draw "rectangle 43,44 318,238" result2.png
现在我们可以砍下个人网页出来:
convert scan.jpg -crop 276x188+352+54 doc1.png
convert scan.jpg -crop 275x194+43+44 doc2.png
您可以尝试findContours。
findContours (image, contours, hierarchy,
CV_RETR_EXTERNAL,
CV_CHAIN_APPROX_SIMPLE,
Point(0, 0));
然后使用drawContours来查看是否选择了所需的图像。 您可以找到轮廓的边界框,而不必担心错误的扫描。 如果这不起作用,尝试预处理您的图像,你可以尝试变形,阈值等。
我希望这有助于!
我认为这是OpenCV。将来,请确定正在使用的代码。 – fmw42
马克·瑟特查问我告诉我的剧本,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操作后的原始掩模和所连接的部件的处理之前除去小斑点:
下面是抗扭斜unrotation后的两个提取的图像。
感谢您分享! –
优秀的作品,弗雷德!谢谢。请保留答案,以便我们都可以分享和学习。 –
合适的图像可能会引起一个更好的答案。 –
@MarkSetchell将获得一个适当的代表性的形象,不能上传的实际图像为隐私的原因 –
优秀!这样可以更清晰地显示分辨率和尺寸,噪音量,分离度和颜色 - 只是模糊或变黑最敏感的部件,但会尽可能多地留下图案和边框/环绕声。 –