【问题标题】:computing pixel covariances in a masked multi-channel matlab image计算带掩码的多通道 matlab 图像中的像素协方差
【发布时间】:2011-12-20 17:54:52
【问题描述】:

我有一个 RGB 图像,叫它img,表示为一个大小为 (100,200,3) 的双精度数组

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

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

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

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

直接在循环中为每个通道执行类似的操作,提取值,然后构建一个大的 3xN 矩阵(其中 N 是 mask 中“真”的数量,最后,对其进行操作具有均值和 cov 的矩阵。好​​奇是否有办法在没有循环的情况下做到这一点。我没有看到它。

【问题讨论】:

    标签: image matlab covariance mask


    【解决方案1】:

    将您的蒙版复制到三维并像平常一样应用它。然后简单地将向量输出重塑为一个矩阵,其中掩码中的每个像素对应一行,每个颜色通道对应一列。这是一个使用内置图像的示例:

    % 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
    

    【讨论】:

    • 我同意这是唯一的解决方案。但是,这难道不是 Matlab 应该在没有 repmatting 你的面具的情况下能够做到的吗?当然应该有一些简单的语法来做到这一点,比如X(mask, :)?它将节省大量内存和编码,据我所知,它在通用代码中无处不在。
    • @SanjayManohar 完全同意!您可以执行bsxfun(@times, X, mask) 之类的操作,而不是执行逻辑索引。不过还是很烦人,没有办法进行自动回收。
    • @Sanjay,正是出于这样的原因,我发现 Matlab 编码是苦差事。没有简单的方法可以解决语言中这样的缺点。但是,与竞争对手相比,Mathworks 客户支持是一流的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 2021-10-21
    • 1970-01-01
    • 2013-04-24
    • 2013-02-27
    • 2012-11-22
    相关资源
    最近更新 更多