【问题标题】:Accessing elements in matlab, get pixels of color image (array) from indices stored in another array访问matlab中的元素,从存储在另一个数组中的索引中获取彩色图像(数组)的像素
【发布时间】:2013-12-02 08:10:00
【问题描述】:

AB 是掩码索引(分别为行和列),C 是图像,我想注意存储在 C 中的颜色值,其索引存储在 AB。如果AB 类似于[1, 2, 3][20, 30, 40],那么我想找到C(1, 20, :)C(2, 30, :)C(3, 40, :)

如果我执行D = C(A, B, :),在这种情况下我会得到一个大小为 3x3x3 的数组,但是我想要一个大小为 3x1x3 的数组。我知道我在搞乱索引,有没有一种简单的方法可以在不编写循环的情况下做到这一点?

简单地说,有没有办法在没有循环的情况下执行以下操作:

for i = 1:10
    D(i, :) = C(A(i), B(i), :)
end

【问题讨论】:

    标签: arrays matlab image-processing indexing


    【解决方案1】:

    您需要将子索引转换为线性索引。您可以为此使用sub2ind

    r = C(sub2ind([size(C,1) size(C,2) 1],A,B,1*ones(1,length(A))));
    g = C(sub2ind([size(C,1) size(C,2) 2],A,B,2*ones(1,length(A))));
    b = C(sub2ind([size(C,1) size(C,2) 3],A,B,3*ones(1,length(A))));
    

    您想要的 n x 1 x 3 结果就是 cat(3, r.',g.',b.')

    【讨论】:

      【解决方案2】:

      为什么不喜欢

      C = C(A,B(i),:);
      

      您可以使用 for 语句来获取 i 的值或以其他方式设置它。

      【讨论】:

      • 这不起作用,我不想使用 for 循环。您需要执行 D(i, :) = C(A(i), B(i), :) 并遍历所有索引
      【解决方案3】:

      听起来一切正常。在您的示例中,您使用 A 和 B 索引了 C 的 9 个元素。然后 D 是一个 3x3x3 数组,其尺寸对应于 [row x col x color_mask(RGB)]。除非 B 只包含一个值(表示您只想从一列中获取元素),否则为什么第二维会减少到 1?当然 A 和 B 不能包含高于 C 中的行数和列数的值。

      A = [1 2 3];
      B = [20];
      D = C(A,B,:);
      size(D)
      >> 3 1 3
      

      编辑:好的,我现在明白你的意思了。您想使用 A(Nx1) 和 B(Nx1) 指定 N 个点。不是您当前获得的 NxN 点数。

      【讨论】:

      • 可能是我的问题不清楚,当然matlab给出了一个3x3x3矩阵,但我想得到与我在A和B中的点相对应的元素,假设元素在A中具有相同的索引和B代表C中的同一个点
      猜你喜欢
      • 1970-01-01
      • 2021-11-24
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多