【问题标题】:How to assign values to image in matlab如何在matlab中为图像赋值
【发布时间】:2015-01-08 14:39:34
【问题描述】:

我有 5 列 x、y、r、g、b 的值,分别是行号、列号、红色、绿色和蓝色。这个 n × 5 矩阵的行没有特定的顺序,但是它们与 image(x,y) 和 r,g,b 一致。

我想做I=uint8(zeros(480,640,3) 之类的事情,然后根据 n x 5 mat 更改那些 rgb 值。

类似于I(mat(:,1), mat(:,2), 1)=mat(:,3) for red etc

【问题讨论】:

    标签: arrays matlab image-processing multidimensional-array


    【解决方案1】:

    下面使用linear indexing的概念和通用的bsxfun函数:

    m = 640; %// number of rows
    n = 480; %// number of columns
    I = zeros(m, n, 3, 'uint8'); %// initiallize directly as uint8
    I(bsxfun(@plus, x(:)+(y(:)-1)*m, (0:2)*m*n)) = [r(:) g(:) b(:)]; %// fill values
    

    小例子:for

    m = 2;
    n = 3;
    x = [1 2 1];
    y = [1 1 2];
    r = [ 1  2  3];
    g = [11 12 13];
    b = [21 22 23];
    

    代码产生

    I(:,:,1) =
        1    3    0
        2    0    0
    
    I(:,:,2) =
       11   13    0
       12    0    0
    
    I(:,:,3) =
       21   23    0
       22    0    0
    

    【讨论】:

    • 这似乎可行,但似乎比预期位置稍微向左和向上移动像素
    • 嗯...不在我上面的示例中。您是否使用基于 0 的索引?
    • 看起来是这样的......我有一个在 c++ 中生成这些值的 mex
    • 非常感谢您的回答,我只是在所有 x 和 y 上加了 1,现在像素就在它们所属的位置
    • @valentin 是的,Matlab 使用基于 1 的索引,而不是像 C++ 和其他语言那样基于 0 的索引。这可能会令人困惑。很高兴它成功了!
    【解决方案2】:

    另一种选择:

    INDr = sub2ind([480, 640, 3], mat(:, 1), mat(:,2), ones([numel(mat(:,3)), 1]));
    INDg = sub2ind([480, 640, 3], mat(:, 1), mat(:,2), 2*ones([numel(mat(:,3)), 1]));
    INDb = sub2ind([480, 640, 3], mat(:, 1), mat(:,2), 3*ones([numel(mat(:,3)), 1]));
    
    I=uint8(zeros(480,640, 3));
    
    I(INDr)=mat(:,3);
    I(INDg)=mat(:,4);
    I(INDb)=mat(:,5);
    

    注意,在 Matlab 中,坐标轴之间的约定在图像和数组之间是不同的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2011-01-21
      • 2023-04-10
      • 2013-01-12
      相关资源
      最近更新 更多