我有5列x,y,r,g,b,其中包含行号,列号,红色,绿色和蓝色的值。这个n×5矩阵的线不是特定的顺序,但是它们与图像(x,y)和r,g,b一致。
我想做I=uint8(zeros(480,640,3)
之类的事情,只需根据n×5垫改变那些rgb值。
I(mat(:,1), mat(:,2), 1)=mat(:,3) for red etc
答案 0 :(得分:2)
以下使用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
答案 1 :(得分:1)
替代方案:
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中,轴之间的约定在图像和数组之间是不同的。