我建议不要首先进行边缘检测,丢失与颜色相关的有价值的信息.您可以尝试一些聚类算法,如
K-Means (including source code)或其他任何.
完成群集后,您可以将与群集相关的像素保留在对象中.可以基于图像中的对象位置(包括图像的裁剪)及其颜色来选择期望的聚类.
2个集群的K-Means聚类的代码示例如下:
he = imread('D:\1.jpg');
imshow(he);
cform = makecform('srgb2lab');
lab_he = applycform(he,cform);
ab = double(lab_he(:,:,2:3));
nrows = size(ab,1);
ncols = size(ab,2);
ab = reshape(ab,nrows*ncols,2);
%One cluster for your object and one for background
nColors = 2;
[cluster_idx, cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ...
'Replicates',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 = he;
color(rgb_label ~= k) = 0;
segmented_images{k} = color;
end
%Show both clusters: object and non-object
imshow(segmented_images{1});
figure;
imshow(segmented_images{2});
结果分割非常好: