这是我的原始图片:
我已经要求用户对其进行裁剪,将其转换为灰度并在其上运行这行代码:
edgeImg = edge(grayImg,'canny',0.23);
这是结果:
本质上,我想“切掉”中间圆圈和外边缘的所有内容。我真的很难弄清楚如何做到这一点,老实说我很茫然。
我考虑过把二值图像中我想保留的区域填上,然后我就可以把它当作一个图章,但是我想不出一个不填满中间圆圈的方法
有什么想法吗?
谢谢。
编辑:这个白色区域是我想保留的:
最佳答案
我建议首先不要进行边缘检测,你会丢失与颜色相关的有值(value)的信息。您可以尝试一些聚类算法,例如 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});
生成的分割非常好:
关于matlab - "Cut out"基于边缘检测的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29827158/