我想在特定图像上应用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);
有没有办法分别提取每种颜色?
这是一个示例图像。我想单独提取棕色,单独提取绿色等等......
答案 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 轻松获得颜色。