Как применить морфологические операции, такие как очистка границ и удаление небольших объектов на цветных изображениях?
У меня есть цветное изображение:
Затем я применил алгоритм 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
ИМО ваше изображение на самом деле является бинарным, так как вы заботитесь о форме и операциях над формой.
Бинаризируйте и примените двоичные операции, затем объедините с оригиналом (перенесите цвета в бинаризованные пиксели). Возможно, вам придется экстраполировать данные при появлении новых пикселей. Существуют так называемые методы рисования. Вы можете исследовать восстановление Пуассона, которое похоже на средневзвешенное значение соседних известных пикселей.