MATLAB中用于分割遮挡叶片的分水岭分割算法

5
主要任务是在MATLAB中消除叶片的复杂背景并从遮挡的叶片图像中提取目标叶片。为了消除背景,我应用了K-means聚类算法。现在的主要任务是使用分水岭分割算法对遮挡的叶片进行分割。但我无法为每个单独的叶片找到完美的分割。请帮助我。我已经上传了样本图像和分水岭分割代码。
原始图像如下: enter image description here 使用K-Means聚类算法和分水岭分割后的图像如下: enter image description here 我希望将主要的中间叶片作为一个单独的部分,以便我可以提取它。
以下是分水岭分割代码:
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 抱歉代码缩进不好,但请帮我找到解决方案。 - Rohit Kalaghatkar
你想要提取哪个叶子? - vini
你的叶片分割算法必须在什么样的环境条件下运行?你能控制场景吗?它是否必须使用分水岭算法?我不确定梯度信息是否足够强大,能给你一个稳健的解决方案。你可能需要一种允许你部署更强的先验知识的算法或模型。叶子的形状是非常固定的,因此也许考虑使用可变形模型会更合适。如果时间很短,也许基于区域生长的启发式方法可以让你快速得到一些结果? - William Payne
@vini 我们正在尝试提取覆盖图像最大部分的叶子,无论哪个叶子在中心位置,并消除其余其他叶子。 - Rohit Kalaghatkar
@WilliamPayne 叶子分割算法应该适用于单个叶子和复杂背景的遮挡叶子,如其他叶子、土壤、残留物、茎、枝等。在应用分水岭分割算法后,我们无法正确控制叶子的分割。需要提取覆盖图像较大部分且位于中心的叶子,并消除其余所有叶子。该算法需要改进。请建议其他更好的方法。 - Rohit Kalaghatkar
2个回答

2
我认为你应该尝试前景提取算法,而不是一般的分割。其中一种算法是GrabCut。另一个有用的方法是在尝试提取前景对象之前,在图像表示中实现一定程度的照明变化。其中一种方法是使用Chong颜色空间

0
如果用户可以进行任何交互,那么使用GrabCut(如@Victor May所提到的)或更基本的交互式图形剪切将使您的分割更好。
否则,对于各种图像,自动分割非常难以完美实现。也许您可以尝试一些后处理,其中比较相邻区域并根据相似度度量(或基于两个段之间梯度强度的大小)合并它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接