Как применить морфологические операции, такие как очистка границ и удаление небольших объектов на цветных изображениях?

У меня есть цветное изображение:

образ

Затем я применил алгоритм k-средних и выбрал это изображение в качестве подходящего кластера:

выбранное изображение

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

Я хочу выделить только ячейку в середине изображения и извлечь контур в качестве последнего шага.

Код является:

NbIm = size(names1,1);
n1 = 1;
n2 = NbIm;
for  n = n1:n2
    %  1- Lecture de l'image originale
    ImPath1 = strcat(DirName1,ImName1(n)); % Chemin de chaque image
    Im_originale = imread(char(ImPath1));  % Chargement image

    %  1-  Appliquer la méthode K-means pour générer TROIS classes
    cform = makecform('srgb2lab');
    lab_he = applycform(Im_originale,cform);
    ab = double(lab_he(:,:,2:3));
    nrows = size(ab,1);
    ncols = size(ab,2);
    ab = reshape(ab,nrows*ncols,2);
    nColors = 3;

    % repeat the clustering 3 times to avoid local minima
    [cluster_idx, cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ...
        'Replicates',3);
    pixel_labels = reshape(cluster_idx,nrows,ncols);
    % imshow(pixel_labels,[]), title('image labeled by cluster index');

    segmented_images = cell(1,3);
    rgb_label = repmat(pixel_labels,[1 1 3]);
    for k = 1:nColors
        color = Im_traiter;
        color(rgb_label ~= k) = 0;
        segmented_images{k} = color;
    end
    C1=segmented_images{1};
    C2=segmented_images{2};
    C3=segmented_images{3};

    % 2-  Selectionner la classe à traiter
    [m ind]=min(cluster_center);
    ClusterChoix=ind;
    Im1_traiter=segmented_images{ClusterChoix};
end

2 ответа

Вы можете изменить свой код следующим образом, чтобы применить некоторую морфологическую обработку:

Оригинальный код:

pixel_labels = reshape(cluster_idx,nrows,ncols);
segmented_images = cell(1,3);
rgb_label = repmat(pixel_labels,[1 1 3]);
for k = 1:nColors
   color = Im_traiter;
   color(rgb_label ~= k) = 0;
   segmented_images{k} = color; 
end

Модифицированный код:

pixel_labels = reshape(cluster_idx,nrows,ncols);
segmented_images = cell(1,3);
for k = 1:nColors
   mask = pixel_labels == k;
   % Insert morphological operations here on the binary image `mask`
   color = Im_traiter;
   color(repmat(~mask,[1 1 3])) = 0;
   segmented_images{k} = color; 
end

ИМО ваше изображение на самом деле является бинарным, так как вы заботитесь о форме и операциях над формой.

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

Другие вопросы по тегам