2014-09-04 4 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

+4

+1 для исполняемого кода! Редкость в 'Stackoverflow'. – Divakar

+0

@rayryeng спасибо! вы действительно удивительны, и я очень ценю вашу помощь, но, к сожалению, кодирование - это не одна из моих сильных сторон, и ее легко сказать, что я хочу сделать, но написать код и синтаксис - это совсем другая игра с мячом для меня:/ – user3788581

ответ

0

Я никогда не запускал Matlab в своей жизни, поэтому не могу сказать вам точные строки кода в Matlab ... однако я могу рассказать вам, как удалить не горизонтальные линии в общих терминах.

Вы просто свертка изображения с соответствующим ядром, горизонтально ориентированным, так и для ваших потребностей ядра будет:

0  0  0 
0.33 0.33 0.33 
0  0  0 

Так в основном каждый пиксель выходного изображения становится среднее сама по себе и ее левому и правых соседей.

Start Image

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: 

, который дает следующий результат, показывающий ваши белые линии на смещениях 149,218,476 линии от вершины ,

... 
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

0

размывания ваш гистограмму:

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

здесь 10 служивший окно размер, он должен регулироваться в соответствии с прямолинейностью вашей линии.

btw, более общий способ поиска строк - hough transform.

+0

Привет, спасибо за ваш ответ, не могли бы вы рассказать о том, как преобразование hough применяется к этой проблеме? Я прочитал некоторую литературу по ней и, кажется, обнаружил линии визуально, но на самом деле не дает количественную обратную связь на расстоянии (если только я чего-то не хватает) – user3788581

+0

Результатом преобразования hough будут пары «тета» и «d», каждая из них представляет собой обнаруженную линию. Theta - ориентация линии, d - расстояние до начала изображения. Эти значения могут использоваться для ваших вычислений. – lanpa

Смежные вопросы