如何应用形态学操作,例如清除边界和去除彩色图像上的小物体?

时间:2018-08-16 11:37:10

标签: matlab image-processing image-morphology

我有彩色图像:

image

然后我应用k-means算法并将此图像选择为合适的聚类:

selected image

我想使用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 个答案:

答案 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