2015-07-02 2 views
5

Я пытаюсь использовать douglas-peucker алгоритм, чтобы упростить мой подключен components.I получить мои связные компоненты, используя bwlabel и я посылаю его к douglas algorithm.Here является звеном алгоритма, который я являюсь using- Douglas-Peucker Algorithm matlabлиния Упрощение обработки изображений

Вот мой код-

clc; 
image=imread('mmm1.jpg'); 
image = im2bw(image); 

[imx imy]=size(image); 
n1=zeros(imx,imy); 
I=zeros(imx,imy); 
L = bwlabel(image,8) ;%Calculating connected components 
[r,c] = find(L==1);  %Using 1st connected component 
n1=zeros(imx,imy); 
rc = [r c]; 

[ps mm]  = dpsimplify(rc,1);   %Douglas-Peucker algorithm 

%To display original component 
%___________________________________________________________________ 
[sx sy]=size(rc); 
for j=1:sx 
    x1=rc(j,1); 
    y1=rc(j,2); 
    n1(x1,y1)=1; 
end 
figure,imshow(n1); 
%___________________________________________________________________ 
%To display component after simplification 
n1=zeros(imx,imy); 
[sx sy]=size(mm); 
for j=1:sx 
    x1=rc(j,1); 
    y1=rc(j,2); 
    n1(x1,y1)=1; 
end 
figure,imshow(n1); 

Это был мой первоначальный вход image- enter image description here

Это был мой 1st компонент, к которому я обратился Douglas-Peucker algorithm-

enter image description here

Это было результатом algorithm- enter image description here

Код Дугласа Peucker можно найти в ссылке я уже упоминал выше. Итак, Мой вопрос: Почему упрощение не происходит для всего компонента? Как я могу это исправить?

+0

Я думаю, потому что вам нужны точки или линии, которые описывают «линию», а не пиксели. Сначала попробуйте получить скелет вашего изображения. https://uk.mathworks.com/help/images/ref/bwmorph.html –

+0

PD: Почему вы хотите упростить эти строки? Что вы ожидаете? Они так же просто, как они могут получить. –

+0

@AnderBiguri Это связано с тем, что когда я запускаю алгоритм определения угла, многие из наклонных линий на этом изображении, которые недостаточно упрощены, они дают неправильный результат. Обнаружение бордера не запускается на этих изображениях, поскольку оно обнаруживает слишком много угловых точек. – Noober

ответ

2

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

Я подготовил элемент структурирования вертикальной линии (SE), а затем создал еще два SE, повернув его на 60 и 120 градусов вокруг его центра. Я разрушил исходное изображение этими SE, а затем получил подключенные компоненты.

im = imread('IWVlt.jpg'); 
bw = im2bw(im, graythresh(im)); 

% SEs 
w = 15; 
line = zeros(w); 
line(:, round(w/2)) = 1; 

bw1 = zeros(size(bw)); 

for i = 1:3 
    bw1 = bw1 + imerode(bw, line); 
    line = imrotate(line, 60, 'nearest'); 
end 

[lbl, n] = bwlabel(bw1, 8); 

figure, imshow(bw1) 
figure, imshow(label2rgb(lbl)) 

В результате я получаю 25 компонентов. Изменяя w в коде, вы можете свести к минимуму ошибку. bonds

Для w = 9, которое является наименьшим значением w при обнаружении всех сегментов, я получаю 26 компонентов. Вы можете отфильтровать слишком малые компоненты. bonds2

+0

Привет!Я сделал чат для нас, чтобы мы могли обсуждать вещи, связанные с MATLAB, которые могут быть вне темы, или охватывают больше времени, чем то, что может быть помещено в поле комментариев. Приезжайте, когда у вас будет время! http://chat.stackoverflow.com/rooms/81987/matlab – rayryeng

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