I = imread('Sub1.png');
figure, imshow(I);
I = imcomplement(I);
I = double(I)/255;
I = adapthisteq(I,'clipLimit',0.0003,'Distribution','exponential');
k = 12;
beta = 2;
maxIter = 100;
for i=1:length(beta)
[seg,prob,mu,sigma,it(i)] = ICM(I, k, beta(i), maxIter,5);
pr(i) = prob(end);
hold on;
end
figure, imshow(seg,[]);
и функция ICM определяется как
function [segmented_image,prob,mu,sigma,iter] = ICM(image, k, beta, max_iterations, neigh)
[width, height, bands] = size(image);
image = imstack2vectors(image);
segmented_image = init(image,k,1);
clear c;
iter = 0;
seg_old = segmented_image;
while(iter < max_iterations)
[mu, sigma] = stats(image, segmented_image, k);
E1 = energy1(image,mu,sigma,k);
E2 = energy2(segmented_image, beta, width, height, k);
E = E1 + E2;
[p2,~] = min(E2,[],2);
[p1,~] = min(E1,[],2);
[p,segmented_image] = min(E,[],2);
prob(iter+1) = sum(p);
%find mismatch with previous step
[c,~] = find(seg_old~=segmented_image);
mismatch = (numel(c)/numel(segmented_image))*100;
if mismatch<0.1
iter
break;
end
iter = iter + 1;
seg_old = segmented_image;
end
segmented_image = reshape(segmented_image,[width height]);
end
Вывод моего алгоритма представляет собой логическую матрицу (seg
) размера 305 на 305.Когда я использую
imshow(seg,[]);
, я могу отобразить изображение.Это показывает другой компонент с изменяющимся значением серого.Но bwlabel
возвращает 1. Я хочу отобразить подключенные компоненты.Я думаю, что bwlabel
порождает изображение до 1. unique(seg)
возвращает значения от 1 до 10, так как количество классов, используемых в k-средних, равно 10. Я использовал
[label n] = bwlabel(seg);
RGB = label2rgb(label);
figure, imshow(RGB);
Мне нужны все эллиптические структурыкоторые находятся между двумя квадратами ближе к середине изображения.Я не знаю, сколько в нем классов.
Исходное изображение:
Основная правда:
Мой вывод: