【问题标题】:Combine Matlab cell elements to a single vector将 Matlab 单元格元素组合为单个向量
【发布时间】:2016-04-12 08:57:33
【问题描述】:

我有 3 480 行 x 640 列的图像。每个像素都有一个强度值。

我在 matlab 中阅读它们:

   object_intensities = cell(1,6);
   for pat=1:3
       file1 = sprintf('image%d.pgm',pat-1);
       dummy = double(imread(file1));
       object_intensities{pat} = dummy;
   end

现在对于 pat = 1 到 3,object_intensities 是一个元胞数组,这样 object_intensities{pat} 的每个元胞元素都将每个图像保存在一个 480x640 矩阵数组中。

现在我需要的是一个 480 行 x 640 列的单一结构,这样每个单元格元素在一个向量中包含每个图像像素的 3 个强度,如下所示:

structure{row 1, column 1} = [image1_intensity @ row1 column1 image2_intensity @ row1 column1 image3_intensity @ row1 column1]
structure{row 1, column2} = [image1_intensity @ row1 column2 image2_intensity @ row1 column2 image3_intensity @ row1 column2]
.
.
structure{row 480, column 640} = [image1_intensity @ row480 column640 image2_intensity @ row480 column640 image3_intensity @ row480 column640]

有什么方法可以不使用循环而是通过矢量化来做到这一点?

【问题讨论】:

  • 三个图像的强度是RGB通道的吗?还是object_intensities 的每个单元格实际上都包含一个 480-by-640-by-3 矩阵?如果它确实包含一个单通道图像(我怀疑你使用imread,你可能需要先将其转换为灰度)然后尝试cat(3,object_intensities{:}),你会得到一个不错的480 i>-by-640-by-3 矩阵。但是我想你可以在阅读图像时这样做,基本上,你为什么想要你说你想要的数据结构?与常规矩阵相比,它真的很难处理。
  • 图像已经是灰度的。我希望在我描述的这个数据结构中使用它,因为我需要每个图像像素的强度序列。
  • 3D 矩阵会更好,单元阵列更难处理。此外,我很确定imread 默认情况下会使您的图像变为 RGB,无论它是否为灰度。您仍然需要进行转换。

标签: matlab image-processing cell-array


【解决方案1】:

你想要的数据结构是自找麻烦。而是使用 3D 矩阵,其中第三维映射您的强度(按顺序)。下线工作会容易得多。

我建议你像这样创建它:

object_intensities = zeros(480,640,3);
for pat=1:3
    file1 = sprintf('image%d.pgm',pat-1);
    object_intensities(:,:,pat) = rgb2gray(imread(file1));
end

现在你的结构上的object_intensities{i,j} 只是object_intensities(i,j,:),如果你真的需要,你可以调用squeezepermute(:)' 使其成为行向量。但是想想现在找到每个像素的平均强度是多么容易

mean(object_intensities,3)

与元胞数组比较

cellfun(@mean,object_intensities,'uni',0)  %// Just a loop in disguise

如果你想要每行的平均值怎么办

mean(object_intensities,2)

尝试对元胞数组执行此操作,您就会明白为什么要避免它。

但如果你真的想要你的结构,那么使用我上面的代码并在 3D 矩阵上调用 mat2cell

mat2cell(object_intensities, ones(size(object_intensities,1),1), ones(1,size(object_intensities,2)),3)

【讨论】:

  • 我很欣赏这个答案,但我不会找到任何平均值或任何其他操作。在我正在处理的遗留代码中,我原始帖子中所需的数据结构最适合它。
  • @user1431515 我仍然对此表示怀疑。但是只需使用我上面的代码和mat2cell 来获得你想要的结构。显然mean 只是说明性的,它几乎适用于您想对这些数据做的任何事情。
  • 假设我使用 480x640x3 矩阵的第 250 行。代表我的图像序列的第 250 行的 3x640 矩阵是否可能?
  • 如果您使用简单的 3D 矩阵,则可以使用 permute(object_intensities(250,:,:),[3,2,1]),其中 permute 用于交换第 1 维和第 3 维。如果你使用你的结构,那么它会像permute(cat(2,object_intensities{250,:}),[3,2,1]) 我认为
  • 从您的帖子中发现了 matlab 函数挤压。谢谢@Dan!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
相关资源
最近更新 更多