【发布时间】:2012-04-23 16:19:40
【问题描述】:
主要任务是消除叶子的复杂背景,并在 MATLAB 中从遮挡的叶子图像中提取目标叶子。 为了消除背景,我应用了 K-means 聚类算法。现在的主要任务是使用分水岭分割算法从被遮挡的叶子中分割出叶子。 我无法为每一片叶子找到完美的片段。请帮我。我已经上传了示例图片和分水岭分割代码。
原图
去除背景后的图像使用K-Means聚类算法和叠加在原始图像上的分水岭分割
我希望主要的中间叶子是一个片段,以便我可以提取它。
下面我给出了分水岭分割代码
function wateralgo(img)
F=imread(img);
F=im2double(F);
%Converting RGB image to Intensity Image
r=F(:,:,1);
g=F(:,:,2);
b=F(:,:,3);
I=(r+g+b)/3;
imshow(I);
%Applying Gradient
hy = fspecial('sobel');
hx = hy';
Iy = imfilter(double(I), hy, 'replicate');
Ix = imfilter(double(I), hx, 'replicate');
gradmag = sqrt(Ix.^2 + Iy.^2);
figure, imshow(gradmag,[]), title('Gradient magnitude (gradmag)');
L = watershed(gradmag);
Lrgb = label2rgb(L);
figure, imshow(Lrgb), title('Watershed transform of gradient magnitude (Lrgb)');
se = strel('disk',20);
Io = imopen(I, se);
figure, imshow(Io), title('Opening (Io)');
Ie = imerode(I, se);
Iobr = imreconstruct(Ie, I);
figure, imshow(Iobr), title('Opening-by-reconstruction (Iobr)');
Ioc = imclose(Io, se);
figure, imshow(Ioc), title('Opening-closing (Ioc)');
Iobrd = imdilate(Iobr, se);
Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));
Iobrcbr = imcomplement(Iobrcbr);
figure, imshow(Iobrcbr), title('Opening-closing by reconstruction (Iobrcbr)');
fgm = imregionalmin(Iobrcbr);
figure, imshow(fgm), title('Regional maxima of opening-closing by reconstruction (fgm)');
I2 = I;
I2(fgm) = 255;
figure, imshow(I2), title('Regional maxima superimposed on original image (I2)');
se2 = strel(ones(7,7));
fgm2 = imclose(fgm, se2);
fgm3 = imerode(fgm2, se2);
fgm4 = bwareaopen(fgm3, 20);
I3 = I;
I3(fgm4) = 255;
figure, imshow(I3), title('Modified regional maxima superimposed on original image (fgm4)');
bw = im2bw(Iobrcbr, graythresh(Iobrcbr));
figure, imshow(bw), title('Thresholded opening-closing by reconstruction (bw)');
D = bwdist(bw);
DL = watershed(D);
bgm = DL == 0;
figure, imshow(bgm), title('Watershed ridge lines (bgm)');
gradmag2 = imimposemin(gradmag, bgm | fgm4);
L = watershed(gradmag2);
I4 = I;
I4(imdilate(L == 0, ones(3, 3)) | bgm | fgm4) = 255;
figure, imshow(I4), title('Markers and object boundaries superimposed on original image (I4)');
Lrgb = label2rgb(L, 'jet', 'w', 'shuffle');
figure, imshow(Lrgb), title('Colored watershed label matrix (Lrgb)');
figure, imshow(I), hold on
himage = imshow(Lrgb);
set(himage, 'AlphaData', 0.3);
title('Lrgb superimposed transparently on original image');
end
【问题讨论】:
-
@Phonon 抱歉,代码缩进很差,但请帮我解决。
-
您要提取哪片叶子?
-
您的叶子分割算法必须在什么样的环境条件范围内执行?你对现场有控制权吗?它绝对必须使用分水岭算法吗?我不确定梯度信息是否足够强大,无法为您提供强大的解决方案。您可能需要一种算法或模型来允许您部署更强大的先验。叶子的形状很固定,所以也许看一个可变形的模型可能是合适的。如果时间很短,也许基于区域增长的启发式方法可能会给您一些快速的结果?
-
@vini 我们正在尝试提取覆盖图像最大部分的叶子。哪个叶子在中心。并消除其余的其他叶子。
-
@WilliamPayne 叶子分割算法应该适用于具有复杂背景的单叶和被遮挡的叶子,例如其他叶子,土壤,残留物,茎,枝等。应用分水岭分割算法后,我们无法正确控制叶子的分割。必须提取覆盖图像的较大部分的叶子,并考虑到位于中心的叶子,其余的都必须消除。算法需要细化。请向我推荐一种效果更好的不同方法。
标签: matlab image-processing watershed