基于另一矩阵的值将矩阵值分组为单独的矩阵

时间:2014-05-28 19:06:00

标签: matlab image-processing matrix

我正在读取带有imread的图像,这会产生768x1024x3矩阵,每个像素的R,G,B值。

我有一个函数接收图像并返回每个像素的段标签矩阵,因此该矩阵为768x1024。标签只是数字1,2,3,4,具体取决于函数找到的不同段数。

现在我想计算图像每个部分的平均红色,绿色和蓝色值。所以我想使用段标签矩阵中的索引来查找将所有R,G,B值组合成单独的数组,然后能够计算平均值。

有没有聪明的方法可以做到这一点?使用段矩阵中每个1值的索引从imread矩阵中获取值并将段分组到不同的数组中?我通过这个使用for循环和暴力但是有更好的方法吗?

3 个答案:

答案 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的某些假设值从18

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')