【发布时间】:2016-10-02 22:08:25
【问题描述】:
我正在尝试为图像中的每个像素获取一个包含一行的五列矩阵。前两列是像素的位置 (x,y),其余列是像素的 RGB 值。
我可以使用循环来创建这个矩阵,但是为了提高效率我想对这个操作进行矢量化。我可以分别用 img(:,:,1)、img(:,:,2) 和 img(:,:,3) 获得 RGB 值,但我不知道如何获得 x 和 y 值矢量化时关联的像素。
【问题讨论】:
我正在尝试为图像中的每个像素获取一个包含一行的五列矩阵。前两列是像素的位置 (x,y),其余列是像素的 RGB 值。
我可以使用循环来创建这个矩阵,但是为了提高效率我想对这个操作进行矢量化。我可以分别用 img(:,:,1)、img(:,:,2) 和 img(:,:,3) 获得 RGB 值,但我不知道如何获得 x 和 y 值矢量化时关联的像素。
【问题讨论】:
您可以使用meshgrid 获取所有x 和y 坐标,然后将它们附加到您的数据中,从而生成N x 5 矩阵。
[x, y] = meshgrid(1:size(img, 2), 1:size(img, 1));
out = cat(2, x(:), y(:), reshape(img, [], 3));
【讨论】:
Find 是查询坐标的一种方式。
您可以分离RGB通道,找到坐标然后连接结果:
imgR = img(:, :, 1);
imgG = img(:, :, 2);
imgB = img(:, :, 3);
[rows, cols] = find(imgR + 1); % +1 to avoid zeros!
M = [rows, cols, imgR(:), imgG(:), imgB(:)];
【讨论】:
find 的速度并不快,尤其是在将所有索引制成表格时。
[y, x] = find(imgR)如果有的话
meshgrid 进行了比较,find 的结果更好,但仅适用于小图像。
x 和 y 的定义是一个偏好问题,两者都可以。但既然我们谈论的是在图像中协调,我更喜欢我的。
find 的输出标记为[rows, columns] 或类似名称,以免混淆。