我有一个RGB图像,称之为img
,表示为大小为(100,200,3)的双数组
我有一个二进制掩码(称之为mask
),这是一个大小为(100,200)的逻辑数组。
我想知道遮罩区域的平均像素值。 我还想知道该区域中像素值的完整(3x3)协方差矩阵。
现在,如果这是一个单一频道(而不是3频道)的图像,我可以这样做:
mean(img(mask(:)))
std(img(mask(:)))
直接在每个通道的循环中执行类似的操作,拉出值,然后构建一个大的3xN矩阵(其中N是mask
中“trues”的数量,最后,运行在那个带有均值和cov的矩阵上。好奇如果有一种方法可以在没有循环的情况下完成它。我没有看到它。
答案 0 :(得分:2)
将面具复制到第三个维度并像平常一样应用它。然后简单地将矢量输出重新整形为矩阵,其中掩码中的每个像素都有一行,每个颜色通道都有一列。以下是使用内置图像的示例:
% Load image
X = imread(('board.tif'));
X_size = size(X);
% Make mask
mask = zeros(X_size(1:2));
mask(250:251, 100:102) = 1;
mask = repmat(mask, [1 1 X_size(3)]);
mask = logical(mask);
% Apply mask to image
X_data = X(mask);
X_data = reshape(X_data, [length(X_data)/X_size(3) X_size(3)]);
% Compute stats
mean(X_data)
cov(double(X_data))
现在,只是检查,如果我们检查原始图像X
>> X(250, 100, :)
ans(:,:,1) =
144
ans(:,:,2) =
125
ans(:,:,3) =
123
它应该等于X_data
中的第一行:
>> X_data
X_data =
144 125 123
128 138 135
180 186 184
60 68 70
38 42 26
55 49 44