我有彩色图像:
然后我应用k-means算法并将此图像选择为合适的聚类:
我想使用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
答案 0 :(得分:0)
IMO,当您关心形状和形状操作时,您的图像实际上是二进制的。
二值化并应用二元运算,然后与原始合并(将颜色转移到二值化的像素)。您可能必须在出现的新像素处推断数据。有所谓的修复技术。您可能需要研究泊松重建,这类似于相邻已知像素的加权平均值。
答案 1 :(得分:0)
您可以按以下方式修改代码以应用某些形态处理:
原始代码:
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