2017-04-04 87 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

優秀的作品,弗雷德!謝謝。請保留答案,以便我們都可以分享和學習。 –