我有一个RGB图像,命名为img
,表示为大小为(100,200,3)的双数组
我有一个二进制掩码(称为mask
),这是一个大小为(100,200)的逻辑数组。
我想知道遮罩区域的平均像素值。我还想知道该区域像素值的完整(3x3)协方差矩阵。
现在,如果这是一个单通道(而不是3通道)图像,我可以简单地执行:
mean(img(mask(:)))
std(img(mask(:)))
可以直接在每个通道的循环中执行类似的操作,取出值,然后构建一个大的3xN矩阵(其中N是mask
中"真"的数量),最后使用平均值和cov对该矩阵进行操作。我很好奇有没有办法不用循环。
复制你的蒙版到第三维度,并像平常一样应用它。然后简单地将矢量输出重塑为一个矩阵,其中一行代表遮罩中的每个像素,一列代表每个颜色通道。下面是一个使用内置图像的示例:
% 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