2015-05-27 3 views
1

У меня есть изображениеDraw линии для подключения центроиды

enter image description here.

После того как я обработаю, чтобы найти центроид, у него есть четыре центроида. Моя цель: я хочу связать их с помощью линии и измерить угол между этой областью. Чтобы быть понятным о центроиде и моей цели, вы можете открыть enter image description here.

Здесь мой код для достижения Центроида

I = imread('22c.jpg'); 
Ibw = im2bw(I); 
Ibw = imfill(Ibw,'holes'); 

Ilabel = bwlabel(Ibw); 
stat = regionprops(Ilabel,'centroid'); 
imshow(I); hold on; 
for x = 1: numel(stat) 
    plot(stat(x).Centroid(1),stat(x).Centroid(2),'ro'); 
end 

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

+1

Ваша задача непонятна. Что вы подразумеваете под «измерением угла между этой областью»? –

+0

В картине вы тоже обвели вокруг квадрата, но когда я запускаю ваш код, я не получаю этот круг. Как вы это поняли? –

+0

В чем разница между этим вопросом и вашим [предыдущим вопросом] (http://stackoverflow.com/q/30462831/2545927)? – kkuilla

ответ

1

Вот file exchange link к bresenham.m

Измененный код, чтобы получить все 4 центроиды

%// read your input image 
im = imread('http://i.stack.imgur.com/xeqe8.jpg'); 

BW = im>220; 

CC = bwconncomp(BW); 
stat = regionprops(CC,'Centroid'); 

figure; imshow(BW); hold on 
for x = 1: numel(stat) 
    plot(stat(x).Centroid(1),stat(x).Centroid(2),'ro'); 
end 

Здесь выход:

enter image description here

Дальнейшая реализация:

%// putting all the Centroid coordinates into corresponding x,y variable 
x = [stat(1).Centroid(1),stat(2).Centroid(1),stat(3).Centroid(1),stat(4).Centroid(1)]; 
y = [stat(1).Centroid(2),stat(2).Centroid(2),stat(3).Centroid(2),stat(4).Centroid(2)]; 

%// obtain row and col dim 
[r,c] = size(BW); 

%// get all x,y values connecting the centroid points 
[xAll{1},yAll{1}] = bresenham(x(1),y(1),x(4),y(4)); 
[xAll{2},yAll{2}] = bresenham(x(2),y(2),x(3),y(3)); 
[xAll{3},yAll{3}] = bresenham(x(3),y(3),x(4),y(4)); 

%// change row and col subs to linear index 
for ii = 1:3 
    idx{ii} = sub2ind(size(BW),yAll{ii},xAll{ii}); 
end 

%// change grayscale image to 3D (as you want red line) 
out = repmat(im,[1,1,3]); 

%// obtaining corresponding index of all 3 slices 
for ii = 1:3 
    idxall{ii} = bsxfun(@plus, idx{ii},[0:2].*(r*c)); 
end 

%// keep only the index of 1st slice to 255 and changing rest to 0 to obtain a red line. 
%// Similar process for blue line except keep the index in the 3rd slice to 255 
out(cat(1,idxall{:})) = 0; 
out(idx{1}) = 255; 
out(idx{2}) = 255; 
out(idx{3}+2*(r*c)) = 255; 

%// see what you have obtained 
figure; imshow(out);hold on 
for x = 1: numel(stat) 
    plot(stat(x).Centroid(1),stat(x).Centroid(2),'bo'); 
end 

Результат:

Примечание: линия может выглядеть пунктирная из-за большого размера изображения, но его непрерывного

enter image description here

Последняя цифра увеличенному для просмотра сплошной линии:

enter image description here

Двигаясь дальше:

Вы, возможно, придется взять совет @Spektre найти угол наклона с помощью atan2. Также см. his answer для более подробного объяснения.

+0

@ArseneWe Я думаю, что ArseneWe получил 4 очка (2 центроида и 2 вершины кромки кости), поэтому у него есть 2 линии/оси вместо одного. В этом решении необходим угол между двумя линиями/осями.Проблема в том, что центроид не является точным и не обязательно представляет точку на оси кости, что делает ее непригодной для этой задачи (если кости не симметричны и не выровнены по горизонтали или по вертикали). Расчет угла легко, как я писал в своем предыдущем вопросе (используя 2 x 'atan2 или atanxy', например' ang = | atan2 (dir1) -atan2 (dir2) | 'или одиночный' acos (dot (dir1, dir2)) ' – Spektre

+0

@Spektre спасибо за ваш совет, у меня есть нашел решение. Но ваше предложение относительно угла и ответа Салаи можно объединить в методику сравнения. Спасибо – ArseneWe

+0

@ArseneWe Если вы нашли наш ответ полезным, подумайте о принятии наших ответов. Также, если возможно, как вы сказали, вы можете опубликовать свой собственный ответ объединяя наши ответы и показывая нам свои результаты :) –