Я сегментировал исходное изображение 3.jpg , чтобы получить края гальки, представленные ниже (цветные линии как функция количества пикселей, составляющих каждый компонент) Края галька, идентифицированная с помощью алгоритма Канни . Из-за тени вокруг гальки часть края (красная кривая) не обнаруживается этим алгоритмом. Одним из возможных решений, о котором я думал, было бы объединить все подключенные компоненты (синие пиксели), которые наилучшим образом приближают к краю гальки, начиная с самого длинного (красная кривая), и многократно объединяя дополнительные подключенные компоненты в соответствии с рядом критериев. Одна из основных проблем заключается в том, что некоторые из подключенных компонентов разветвлены, и поэтому мой алгоритм не может просто следовать по одной линии, но должен решить, какой путь выбрать. Я хотел бы избежать этого на первом этапе. Увеличение разветвленного подключенного компонента . Как я могу разделить связанный компонент, который имеет более двух вершин в серии путей (линий) в соответствии с их длиной (от максимальной до минимальной)?
Кроме того, есть ли способ идентификации для каждого пикселя подключенного компонента те, к которым он подключен? По сути, я хотел бы иметь возможность следовать непрерывной координате вдоль пути от одной вершины к противоположной.
большое спасибо за вашу помощь.
Это мой код:
img=imread('3.jpg');
gray=rgb2gray(img);
gray=imgaussfilt(gray,0.8);
N=size(gray);
n_row=N(1);
n_col=N(2);
se = strel('disk',15,8);
Ge = imerode(gray,se);
Gobr = imreconstruct(Ge,gray);
imshow(Gobr)
se1=strel('disk',10,8);
Gobrd = imdilate(Gobr,se1);
Gobrcbr = imreconstruct(imcomplement(Gobrd),imcomplement(Gobr));
Gobrcbr = imcomplement(Gobrcbr);
imshow(Gobrcbr)
E=edge(Gobrcbr,'Canny');
E=bwmorph(E, 'skel');
figure(1)
imshow(labeloverlay(gray,E));
cc=bwlabel(E,8);
cc_rgb=label2rgb(cc);
figure
imshow(cc_rgb)
props=regionprops(cc(:,:), 'Area');
props=struct2cell(props);
props=cell2mat(props);
N_props=size(props);
n_p=N_props(2);
cc_rgb=label2rgb(cc);
figure
imshow(cc_rgb)
props=regionprops(cc(:,:), 'Area');
props=struct2cell(props);
props=cell2mat(props);
N_props=size(props);
n_p=N_props(2);
Area=zeros(n_row,n_col);
for i=1:n_row
for j=1:n_col
for r=1:n_p
if cc(i,j)==r
Area(i,j)=props(1,r);
end
end
end
end
E2_rgb=label2rgb(Area);
E2_GRAY= rgb2gray(E2_rgb);
figure
a=imshow(gray)
hold on
a=imshow(E2_rgb)
hold off
alpha(a, 255-E2_GRAY)