从在单个文档中粘贴了两个图像的图像中获取两个图像- Python/C++
Get two images from image which has two images pasted in a single document- Python/C++
我有一个证件 - 比如说身份证的正反面。像这样的东西
The dotted lines are that of a poorly scanned ID, so the borders are not clear
objective 是将图像 1 和图像 2 作为两个单独的图像检索。扫描的文件是黑白的。
我的问题:
1、这个可行吗?
2. 任何关于如何进行的 ideas/code 片段将不胜感激。
提前致谢,
你可以试试 findContours。
findContours (image, contours, hierarchy,
CV_RETR_EXTERNAL,
CV_CHAIN_APPROX_SIMPLE,
Point(0, 0));
然后用drawContours看看是否选中了想要的图片。
您可以找到轮廓的边界框,而不必担心扫描不好。
如果这不能立即奏效,请尝试预处理您的图像,您可以尝试变形、阈值化等。
希望对您有所帮助!
由于您没有提供和图像...我将提供一些样本。我正在使用 ImageMagick 因为您可以在命令行执行它而无需编译任何东西,但是您可以在 OpenCV 中使用 Python.[= 应用完全相同的技术26=]
所以,这是一个示例图片。
现在,如果曝光不正确,扫描可能会有噪点并且可能没有纯白色和黑色,因此作为第一步,您可以对图像进行归一化或自动调平,将其阈值设置为纯黑色和白色,然后应用中值滤波器去除噪声 - 特别是如果它是 JPEG。
convert scan.jpg -normalize -threshold 90% -median 9x9 -negate result.png
也许您想现在使用一些形态学来闭合孔:
convert scan.jpg -normalize -threshold 90% -median 9x9 -negate -morphology close disk:7 result.png
现在你可以做一些 "Connected Component Analysis" 来找到 blob:
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)
这给出了一个 "labelled" 图像,我们实际上不会使用它,但会识别它在逐渐变浅的阴影中找到的每个斑点。
现在查看上面的文本输出,您可以看到有 5 个 blob - 每行一个。您可以检查第 4 个字段,即斑点的面积和第 5 个字段,即颜色 - 这将有助于区分黑色和白色斑点。让我们看几个斑点并将它们绘制在原始图像上:
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
Mark Setchell 要求我用我的脚本 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 所示。更重要的是,它使用连接组件从掩码中定位两个大区域的边界框,然后从掩码中裁剪和取消旋转相应区域输入图像。
这是在填充操作之后和连接组件处理以去除小斑点之前的原始蒙版:
这是去歪斜反旋转后提取的两张图片。
我有一个证件 - 比如说身份证的正反面。像这样的东西 The dotted lines are that of a poorly scanned ID, so the borders are not clear objective 是将图像 1 和图像 2 作为两个单独的图像检索。扫描的文件是黑白的。
我的问题: 1、这个可行吗? 2. 任何关于如何进行的 ideas/code 片段将不胜感激。
提前致谢,
你可以试试 findContours。
findContours (image, contours, hierarchy,
CV_RETR_EXTERNAL,
CV_CHAIN_APPROX_SIMPLE,
Point(0, 0));
然后用drawContours看看是否选中了想要的图片。 您可以找到轮廓的边界框,而不必担心扫描不好。 如果这不能立即奏效,请尝试预处理您的图像,您可以尝试变形、阈值化等。
希望对您有所帮助!
由于您没有提供和图像...我将提供一些样本。我正在使用 ImageMagick 因为您可以在命令行执行它而无需编译任何东西,但是您可以在 OpenCV 中使用 Python.[= 应用完全相同的技术26=]
所以,这是一个示例图片。
现在,如果曝光不正确,扫描可能会有噪点并且可能没有纯白色和黑色,因此作为第一步,您可以对图像进行归一化或自动调平,将其阈值设置为纯黑色和白色,然后应用中值滤波器去除噪声 - 特别是如果它是 JPEG。
convert scan.jpg -normalize -threshold 90% -median 9x9 -negate result.png
也许您想现在使用一些形态学来闭合孔:
convert scan.jpg -normalize -threshold 90% -median 9x9 -negate -morphology close disk:7 result.png
现在你可以做一些 "Connected Component Analysis" 来找到 blob:
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)
这给出了一个 "labelled" 图像,我们实际上不会使用它,但会识别它在逐渐变浅的阴影中找到的每个斑点。
现在查看上面的文本输出,您可以看到有 5 个 blob - 每行一个。您可以检查第 4 个字段,即斑点的面积和第 5 个字段,即颜色 - 这将有助于区分黑色和白色斑点。让我们看几个斑点并将它们绘制在原始图像上:
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
Mark Setchell 要求我用我的脚本 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 所示。更重要的是,它使用连接组件从掩码中定位两个大区域的边界框,然后从掩码中裁剪和取消旋转相应区域输入图像。
这是在填充操作之后和连接组件处理以去除小斑点之前的原始蒙版:
这是去歪斜反旋转后提取的两张图片。