2017-01-12 101 views
2

我想最終只有文本的圖像。我的代碼會將此圖像視爲灰度圖,並從中除去所有長線,除了文本/符號/測量值之外的所有內容。圖像處理刪除行

enter image description here 這是東西,可以使用諸如高斯模糊,糜爛等,或也許是通過原始像素數據進行迭代並以某種方式確定是否存在的圖像上的線而不是一個文本元素然後轉動來實現那些不是文本的一部分的像素變成白色?我已經開始查看imagemagick庫以及其他解決方案來刪除行。我是圖像處理技術的新手,任何幫助或執行路徑都會非常有幫助。我在java環境下工作

+0

如果你不知道什麼是高斯模糊和它做什麼,你不應該考慮這些事情。獲取一本教科書並從基礎開始。 有沒有簡單的方法來解決你的問題。可以使用許多技術來刪除部分線條,但不會刪除線條,也不會部分刪除文字。你可以使用OCR來識別文本來解決這個問題,但是不要期望太多。 – Piglet

回答

4

我有幾個想法,我可能會進一步發展其中的一些,或者可能不會!


1.使用顏色

圖表看起來你已經從一些包生成它,包括Ghostscript的,而不是從紙張掃描,所以我想你可以控制它的產生。如果是這樣,最簡單和最乾淨的選項可能是在Postscript中插入一個命令來更改所有文本的顏色,或者所有行和圓的顏色,然後您可以使用顏色來提取文本。


2.使用過濾器

你可以使用一個較長的水平探測元件和中位數來確定水平線和長垂直探測元件,以消除垂直線。很顯然,你可以用長度等不甘示弱,但應該是這樣的:

convert drawing.png            \ 
    \(-clone 0 -threshold 50% -negate -statistic median 200x1 \) \ 
-compose lighten -composite          \ 
    \(-clone 0 -threshold 50% -negate -statistic median 1x200 \) \ 
-composite result.png 

我試圖用200的長度:

enter image description here

,並以500爲長度:

enter image description here


3.使用連接成分分析或斑點分析

的想法是找到圖像中的所有斑點,然後刪除您希望保留的字母大小的斑點。我提取圖像的一部分與這種做法發揮:

enter image description here

convert extract.png -colorspace gray -negate -threshold 50% \ 
    -define connected-components:verbose=true    \ 
    -connected-components 8 -auto-level output.png 

輸出

Objects (id: bounding-box centroid area mean-color): 
    2: 943x660+77+0 553.0,296.5 536272 srgb(0,0,0) 
    0: 73x660+0+0 36.0,329.3 48150 srgb(0,0,0) 
    10: 279x176+376+484 507.5,582.9 42374 srgb(0,0,0) 
    8: 167x99+488+413 574.9,458.8 8939 srgb(0,0,0) 
    5: 291x253+370+407 517.6,486.0 8121 srgb(255,255,255) 
    7: 166x83+397+413 477.3,450.4 7479 srgb(0,0,0) 
    9: 77x90+578+436 628.7,491.1 3511 srgb(0,0,0) 
    6: 81x67+376+413 403.5,438.0 3197 srgb(0,0,0) 
    1: 4x660+73+0 74.5,329.5 2640 srgb(255,255,255) 
    3: 221x154+124+328 213.8,440.1 2225 srgb(255,255,255) 
    4: 198x154+686+378 798.3,488.4 2133 srgb(255,255,255) 
    11: 38x59+136+559 154.5,588.1 1094 srgb(255,255,255) 
    12: 37x59+790+559 808.0,588.0 955 srgb(255,255,255) 
    13: 37x59+837+559 855.0,588.0 955 srgb(255,255,255) 
    15: 37x58+230+560 248.6,588.2 888 srgb(255,255,255) 
    16: 37x58+742+560 760.6,588.2 888 srgb(255,255,255) 
    14: 39x58+180+560 201.5,587.8 862 srgb(255,255,255) <--- Let's look at this one 
    19: 23x45+844+566 855.0,588.0 848 srgb(0,0,0) 
    18: 23x45+797+566 808.0,588.0 848 srgb(0,0,0) 
    20: 24x22+143+589 154.5,599.5 420 srgb(0,0,0) 
    17: 18x16+146+566 154.5,573.6 227 srgb(0,0,0) 
    21: 8x11+114+606 117.5,611.0 72 srgb(255,255,255) 
    22: 8x11+720+606 723.5,611.0 72 srgb(255,255,255) 
    23: 2x20+0+628 0.3,637.5 30 srgb(255,255,255) 

的字段在輸出的開始標題,但基本上看blob 14:

14: 39x58+180+560 201.5,587.8 862 srgb(255,255,255) 

它的寬度是39像素,高度是58像素,位於左上角的偏移180,560處,它是白色的(255,255,255),這是因爲我否定了圖像,這意味着它在原始圖像中是黑色的,因此它對應於你的文字的一封信(50x70左右)。

只是說明的方式(不需要實際處理),讓我們得出一個矩形到提取物:

convert extract.png -fill red -draw "rectangle 180,560 219,617" aBlob.png 

enter image description here

請注意,我們已經像偏移及寬度和高度,而下面的-draw rectangle命令需要左上角和右下角,所以我們需要將寬度和高度添加到偏移量以獲得右下角。

好,所以我們現在可以製作所有字母的面具!

convert extract.png -colorspace gray -negate -threshold 50% -define connected-components:verbose=true -connected-components 8 -auto-level output.png | awk -F"[ x+]" '/255,255,255/ && $4<=50 && $5<=80{printf "fill white rectangle %d,%d %d,%d\n",$6,$7,$6+$4,$7+$5}' > draw.txt 

輸出(在文件draw.txt

fill white rectangle 136,559 174,618 
fill white rectangle 790,559 827,618 
fill white rectangle 837,559 874,618 
fill white rectangle 230,560 267,618 
fill white rectangle 742,560 779,618 
fill white rectangle 180,560 219,618 
fill white rectangle 114,606 122,617 
fill white rectangle 720,606 728,617 
fill white rectangle 0,628 2,648 

這裏是如何把所有這些受保護的斑點成面膜:

convert -size 1020x660 xc:black -draw @draw.txt mask.png 

導致這種面膜:

enter image description here

然後我們就可以敷面膜的形象:

convert extract.png mask.png -compose copyopacity -composite result.png 

enter image description here

+0

很難說沒有看到你的圖像 - 請張貼一個適當的,代表性的形象,我會看看,並盡我所能。 –

+0

我得到了2號的工作很好,這確實有很大的幫助。但我想清理圖像更好,所以我正在實施選項3.我在一個Windows環境中工作,所以我試圖將幾個命令轉換爲Windows。我得到「awk」不被認爲是命令,因爲它是unix的東西。你能否讓我開始走向類似於|的窗戶的路徑awk -F「[x +]」'/ 255,255,255/&& $ 4 <= 50 && $ 5 <= 80 {printf「fill white rectangle%d,%d%d,%d \ n」,$ 6,$ 7,$ 6 + $ 7 + $ 5}'> draw.txt? – Boutin