计算一个掩模多通道图像的像素协方差



我有一个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

相关内容

  • 没有找到相关文章

最新更新