计算掩蔽的多通道matlab图像中的像素协方差

时间:2011-11-02 22:28:57

标签: image matlab covariance mask

我有一个RGB图像,称之为img,表示为大小为(100,200,3)的双数组

我有一个二进制掩码(称之为mask),这是一个大小为(100,200)的逻辑数组。

我想知道遮罩区域的平均像素值。 我还想知道该区域中像素值的完整(3x3)协方差矩阵。

现在,如果这是一个单一频道(而不是3频道)的图像,我可以这样做:

mean(img(mask(:)))
std(img(mask(:)))

直接在每个通道的循环中执行类似的操作,拉出值,然后构建一个大的3xN矩阵(其中N是mask中“trues”的数量,最后,运行在那个带有均值和cov的矩阵上。好奇如果有一种方法可以在没有循环的情况下完成它。我没有看到它。

1 个答案:

答案 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