2014-09-04 154 views
3

對於一個項目,我需要找到圖像中各行之間的點距。我想到的方法是將圖像轉換爲二進制圖像,並計算每行中黑色背景上的白色像素數。我附加了我的代碼,只要線條非常直,它就可以很好地工作。統計圖像中每行的像素數

順便說一句,這是一個將被分析的樣本圖像。我計劃變成二進制/運行線檢測算法,以找出線中兩條綠色條帶的邊界,因爲它們之間的距離值得關注。

(http://i.imgur.com/Q5Ef0eJ.jpg)

im = imread('http://i.imgur.com/lc8ESac.png'); %// Read image 
imBinary = double(im2bw(im)); %// Just in case - Convert to binary, 
           %// then make double for sum 
histogram = sum(imBinary,2); %// Compute row-wise histograms 
stem(1:size(imBinary,1), histogram); %// Plot this histogram 
xlabel('Row number'); 
ylabel('White pixel count'); 
grid; 
diffs = diff([0; histogram]); 
threshold = 100; %// Define threshold here 
rows = find(diffs >= threshold); 

此代碼返回的直方圖和峯之間的距離指示線之間的間隔。

爲了糾正彎曲線的問題,我想使用一種分析圖像列(比如100像素)的方法,然後循環直到它循環遍歷整個圖像(0-100列,然後101- 200直到圖像的寬度)。

我有我的僞代碼這裏:

for (loop through rows) 
    for (loop for coloumns) 
     count pixels at p(row, col) 
    end loop for columns 
    column counter = column counter - 1 
    if column counter <= 0 then save the number of pixels counter and set column counter = 10 
end row loop 

然而,作爲一個ChemE大,編碼不是我的強項,我的鬥爭非常符合循環。

我只是希望能夠將上述代碼合併到這個循環中,這樣它就可以將一條彎曲的線分割成許多擬直線,以便能夠計算「平均」或一系列離散線間距。

非常感謝!

+1

嗯:)我知道我認出那個圖像和那個圖像來自某處!我現在要看看你的邏輯,如果我認爲這會奏效,我會提出一些建議。 – rayryeng 2014-09-04 04:00:07

+4

適用於可運行代碼!在'Stackoverflow'的稀有度。 – Divakar 2014-09-04 05:50:02

+0

@rayryeng謝謝!你真的很棒,我非常感謝你的幫助,不幸的是,編碼不是我的優勢之一,它很容易說出我想要做的事情,但是編寫代碼和語法對我來說是一個完全不同的球類遊戲:/ – user3788581 2014-09-04 07:47:00

回答

0

我從來沒有在我的生活中運行Matlab,所以我不能告訴你在Matlab中的確切代碼行......但是我可以告訴你如何從一般條款中刪除非水平線。

您只需卷積圖像與水平定向,所以您需要的內核將是一個合適的內核:

0  0  0 
0.33 0.33 0.33 
0  0  0 

所以基本上輸出圖像中每個像素成爲本身和它的左平均和鄰居。

開機影像

enter image description here

ImageMagick的命令:

convert lines.png -convolve "0,0,0,0.33,0.33,0.33,0,0,0" -threshold 99.99% horiz.jpg 

結束圖像

enter image description here

順便說一句,你的線實際上是5像素厚,所以你可能需要運行一個更大的內核來刪除它們,比如9x9,其中所有的係數都是零,除了中間(第5)線,它們都是1/9即0.111)。

我曾表示出來使用ImageMagick到您的圖像調整到垂直柱的單個像素寬與此命令:

convert lines.png -resize 1x844! -threshold 50% txt: 

其給出以下輸出顯示您的白線是在偏移量從頂部149218476線。

... 
0,144: (0,0,0) #000000 black 
0,145: (0,0,0) #000000 black 
0,146: (0,0,0) #000000 black 
0,147: (255,255,255) #FFFFFF white 
0,148: (255,255,255) #FFFFFF white 
0,149: (255,255,255) #FFFFFF white <- Centre of your line 
0,150: (255,255,255) #FFFFFF white 
0,151: (255,255,255) #FFFFFF white 
0,152: (0,0,0) #000000 black 
0,153: (0,0,0) #000000 black 
0,154: (0,0,0) #000000 black 
... 
0,213: (0,0,0) #000000 black 
0,214: (0,0,0) #000000 black 
0,215: (0,0,0) #000000 black 
0,216: (255,255,255) #FFFFFF white 
0,217: (255,255,255) #FFFFFF white 
0,218: (255,255,255) #FFFFFF white <- Centre of your line 
0,219: (255,255,255) #FFFFFF white 
0,220: (255,255,255) #FFFFFF white 
0,221: (0,0,0) #000000 black 
0,222: (0,0,0) #000000 black 
0,223: (0,0,0) #000000 black 
... 
0,471: (0,0,0) #000000 black 
0,472: (0,0,0) #000000 black 
0,473: (0,0,0) #000000 black 
0,474: (255,255,255) #FFFFFF white 
0,475: (255,255,255) #FFFFFF white 
0,476: (255,255,255) #FFFFFF white <- Centre of your line 
0,477: (255,255,255) #FFFFFF white 
0,478: (255,255,255) #FFFFFF white 
0,479: (0,0,0) #000000 black 
0,480: (0,0,0) #000000 black 
0,481: (0,0,0) #000000 black 
... 

這裏是 「squidged」 圖像 - 紅色背景上的,所以你可以看到它:

enter image description here

+0

非常有趣的替代方案!我之前沒有使用ImageMagick,可以看到這個解決方案是如何工作的,但是我想把它放到一個可以分析稍微彎曲的線條(這是我的主要問題)的循環中。我已經用要分析的圖像的圖片更新了這個問題。 – user3788581 2014-09-04 19:38:50

0

卷積您直方圖:

h_accu = conv(histogram,(1:10)/10); 
figure;plot(h_accu) 

這裏10擔任窗口大小,它應該根據你的線的直線度進行調整。

順便說一句,找到這些行的更一般的方法是hough transform

+0

嗨,感謝您的回覆,請您詳細說明hough變換如何應用於此問題?我已經閱讀了一些關於它的文獻,它似乎可以直觀地檢測線條,但實際上並沒有給出關於距離的定量反饋(除非我錯過了某些東西) – user3788581 2014-09-04 19:35:18

+0

hough變換的輸出將是'theta'和'd'對,它們中的每一個代表檢測到的線。 θ是線的方向,d是到圖像原點的距離。這些值可用於您的計算。 – lanpa 2014-09-05 07:32:57

相關問題