我有一個文檔 - 比如說一個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將獲得一個適當的代表性的形象,不能上傳的實際圖像爲隱私的原因 –
優秀!這樣可以更清晰地顯示分辨率和尺寸,噪音量,分離度和顏色 - 只是模糊或變黑最敏感的部件,但會盡可能多地留下圖案和邊框/環繞聲。 –