Как обработать изображение перед применением bwlabel? - PullRequest
0 голосов
/ 28 декабря 2018
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);

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

Исходное изображение:

Input Image

Основная правда:

Groundtruth

Мой вывод:

Output

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Я пытался сделать все с нуля.Хотелось бы, чтобы это помогло.

У меня есть цепочка лечения, которая сначала получает контуры с параметрами, настроенными методом проб и ошибок, я признаюсь.Последнее «изображение» дано внизу;с его помощью вы можете легко выбрать подключенные компоненты и выполнить, например, реконструкцию по маркерам с помощью оператора imreconstruct.

clear all;close all;
I = imread('C:\Users\jean-marie.becker\Desktop\imagesJPG10\spinalchord.jpg');
figure,imshow(I);
J = I(:,:,1);% select the blue channel because jpg image
J=double(J<50);% I haven't inverted the image
figure, imshow(J);
se = strel('disk',5);
J=J-imopen(J,se);
figure, imshow(J);
J=imopen(J,ones(1,15));% privilegizes long horizontal strokes
figure, imshow(J);
K=imdilate(J,ones(20,1),'same');
% connects verticaly not-to-far horizontal "segments"
figure, imshow(K);

enter image description here

0 голосов
/ 28 декабря 2018

Если вы хотите разбить изображение метки на разные подключенные компоненты, вам нужно использовать цикл для извлечения меток для каждого класса и суммировать изображения меток для получения out изображения метки.

u = unique(seg(:));
out = zeros(size(seg));
num_objs = 0;
for k = 1: numel(u)
    mask = seg==u(k);
    [L,N] = bwlabel(mask);
    L(mask) = L(mask) + num_objs;
    out = out + L;
    num_objs = num_objs + N ;
end
mp = jet(num_objs);
figure,imshow(out,mp)

Что-товот так получается:

connected components

...