3

我已经在 MATLAB 中进行了一些图像分割。附图是结果。我的问题是如何从图像中自动删除树部分(底部)?换句话说,我需要将鸟与周围环境隔离开来。我需要编写一个方法来做到这一点,因为我有数百张这样的图像。谢谢

图片

4

2 回答 2

3

在此处输入图像描述

如果此答案对您来说足够好,请下载以下代码: http: //www.mathworks.com/matlabcentral/fileexchange/32532并尝试以下命令:

I = rgb2gray(imread('BO1NO.jpg'));
th = 0.35 * max(max(I));
[P, J] = regionGrowing(I, [240,390], th, 300, 'true', 'true', 'false');
figure;imshow(J)

由于您可以看到鸟和树木繁茂的树枝之间明显的强度差异,因此尝试区域种植方法比其他任何方法都更合乎逻辑。如果我是你,接下来我会尝试一些彩色图像分割算法。因为我感觉比从 RGB-> Gray 转换时的感觉,我们丢失了一些有用的信息。Bcoz 在图像的灰色版本中,木树枝与鸟的值有些相同(在少数地区)。所以更好地直接处理彩色图像而不转换为灰色。不要急于使用任何模式分类器。它可能会解决您的问题,但如果有更简单/更便宜的解决方案可用,这不是明智之举。有不止一种方法可以严格地在图像处理的范围内解决这个问题,而不会侵入模式识别/机器学习。

于 2012-07-08T00:06:33.603 回答
1

试试这个代码,看看它是否是你需要的:

I = imread('BO1NO.jpg');

% level = graythresh(I); BW = im2bw(I, level);figure;imshow(BW)

BW = im2bw(rgb2gray(I), 0.25);figure;imshow(BW);

% 删除 BW 图像中最大的连通分量(即鸟),这主要给出了分支。因此,从原始 BW 图像中减去结果图像。不同的图像是鸟。

BW1 = BW;
CC = bwconncomp(BW);


numPixels = cellfun(@numel,CC.PixelIdxList);

[biggest,idx] = max(numPixels);

BW(CC.PixelIdxList{idx}) = 0;

figure, imshow(BW);

figure, imshow(BW1);

Ir = imsubtract(BW1,BW);

figure;imshow(Ir)

也可以使用 otsu 的阈值选择方法检查阈值。

于 2012-07-07T21:18:02.067 回答