我正在读取带有imread的图像,这会产生768x1024x3矩阵,每个像素的R,G,B值。
我有一个函数接收图像并返回每个像素的段标签矩阵,因此该矩阵为768x1024。标签只是数字1,2,3,4,具体取决于函数找到的不同段数。
现在我想计算图像每个部分的平均红色,绿色和蓝色值。所以我想使用段标签矩阵中的索引来查找将所有R,G,B值组合成单独的数组,然后能够计算平均值。
有没有聪明的方法可以做到这一点?使用段矩阵中每个1值的索引从imread矩阵中获取值并将段分组到不同的数组中?我通过这个使用for循环和暴力但是有更好的方法吗?
答案 0 :(得分:2)
已编辑可立即处理所有频道。
让img
成为你的RGB图像,labels
成为标签数组。
您可以使用以下标签屏蔽RGB图像:
% create a 3-channels mask:
labelsRGB=repmat(labels, 1, 1, 3);
Segment1=img.*(labelsRGB==1);
标记为1的段中的平均值是:
avg=mean(mean(Segment1, 1), 2);
获取avg(1)
中的平均值,avg(2)
中绿色的平均值等。
同意其他细分市场。
答案 1 :(得分:2)
这是一个代码,您可以在不循环的情况下获得所有内容。
<强>代码强>
%// img is your input RGB image (NxMx3)
%// L is your label matrix (NxM)
t1 = bsxfun(@eq,L,permute(unique(L),[3 2 1]));
t2 = bsxfun(@times,permute(img,[ 1 2 4 3]),t1);
t2(t2==0)=nan;
out = squeeze(nanmean(nanmean(t2)))
%// out is the desired output matrix that is (NLx3),
%// where NL is the number of labels. Thus, the mean of labels is
%// along the rows and the corresponding values for R, G and B are in the three
%// columns of it.
<强>解释强>
让我们使用img
-
img = randi(9,3,4,3)
给我们 -
img(:,:,1) =
9 7 5 3
7 7 2 4
1 6 7 9
img(:,:,2) =
8 6 6 4
4 9 3 9
3 9 8 1
img(:,:,3) =
5 4 4 5
7 2 5 3
2 3 1 3
L
的某些假设值从1
到8
L = [1 3 3 4;
4 5 8 8;
5 6 7 2]
代码输出是 -
out =
9 8 5
9 1 3
6 6 4
5 4 6
4 6 2
6 9 3
7 8 1
3 6 4
让我们看看如何理解输出。
查看输入内容,我们选择位于8
和(2nd row,3rd col)
的标签(2nd row,4th col)
。 R
中这些位置的相应img
值为[2 4]
,因此R
平均值/平均值必须为 {{ 1}} 即可。同样地,对于3
,它必须来自G
,即 [3 9]
,6
的内容必须来自B
,即的 [5 3]
强>
让我们看看4
代表8th
的{{1}}行,我们有 out
,这是先前计算的平均值。同样,其他平均值可以从label-8
解释。
答案 2 :(得分:0)
这是一般的替代方案。 在这种情况下,您不需要遍历不同的段以获得每个段的平均值。
%simulated image and label
img=rand(10,12,3);
labeled=[ones(10,3),ones(10,3)*2,ones(10,3)*3,ones(10,3)*4];
% actual code for the mean
red_mean = regionprops(labeled, img(:,:,1), 'MeanIntensity')