提取有色区域

时间:2013-12-03 21:08:06

标签: matlab image-segmentation

我想在特定图像上应用SRM分割方法后,在MATLAB中提取每个彩色区域。

我尝试了以下方法,但它似乎提取了不同颜色的区域(仅不同的颜色度),并且区域最大。

I = imread('./img/bfly.jpg');
imshow(I)

bw = im2bw(I);
imshow(bw)

L = bwlabel(bw);
imshow(L == 0)

props = regionprops(L);
[~,ind] = max([props.Area]);
imshow(L == ind);

有没有办法分别提取每种颜色?

这是一个示例图像。我想单独提取棕色,单独提取绿色等等......

enter image description here

2 个答案:

答案 0 :(得分:2)

由于您的图片似乎没有平滑的颜色变化,因此应该可以直接将颜色分隔为unique的不同图像,以将图像转换为标签矩阵(您可以使用rgb2ind执行此操作另外)accumarray

[Iu,ia,iu] = unique(reshape(I,[],3),'rows');
counts = accumarray(iu,1);
[counts,sortinds] = sort(counts,'descend');

现在说你想要N最大的组件:

N = 10;
largestLabels = sortinds(1:N);

然后是颜色ii的图像:

mapi = reshape(iu == largestLabels(ii),size(I,1),size(I,2));
numeli = counts(ii)

相应的RGB值和每种颜色的像素数:

>> colorRegionSummary = [uint32(Iu(largestLabels,:)) counts(1:N)]
colorRegionSummary =
     89    120     23   8206  % green
     73     59     42   4370  % dark brown (wing)
     64    128    184   2723  % blue (right shade)
    105    136     25   2143  % green (bottom right shade)
     64    127    178   1667  % blue (top left shade)
    170    151    191   1380  % purple
     58    132    201   1372  % blue (left shade)
    177    130     45   1242  % orange (bottom wing shade)
    184    123     50   1193  % orange (top wing shade)
    118    114     56    586  % tan (top right)

请注意,这些不是连接的组件,只是具有相同颜色的组件。对于给定的mapi,您可以应用bwlabel来获取该颜色的连接组件。

答案 1 :(得分:2)

您可以从一种方式开始编码三种颜色数组(RGB),以便将它们合并为一维二维数组,例如。

2Dimage = I(:,:,1) + 1e3*I(:,:,2) + 1e6*I(:,:,3)

这样,每种颜色都会得到一个唯一的数字:R + 1e3 * G + 1e6 * B.请注意,每个通道都使用区间[0,255]中的数字进行编码。

现在,您可以使用

从图像中提取不同的颜色区域
C = unique(2Dimage)

获取您需要查找的独特颜色,然后

for idx = 1:length(C)
    find(C(idx)==2Dimage)
end

找到图像的不同部分。可以从相应位置/索引处的原始图像 I 轻松获得颜色。