【问题标题】:Large image matrix: save to small matrices大图像矩阵:保存到小矩阵
【发布时间】:2016-08-02 17:42:09
【问题描述】:

我是 MATLAB 及其开发的新手。我有一个 1134(行)X 1134(列)的图像。我希望该图像保存 3(列)X 3(行)。为了做到这一点,我需要 378 个细胞。为此,我使用了以下代码,但它给了我一个错误。

 image=imread('C:\Users\ven\Desktop\test\depth.png');
    I=reshape(image,1,1134*1134);
    chunk_size = [3 3]; % your desired size of the chunks image is broken into
    sc = sz ./ chunk_size; % number of chunks in each dimension; must be integer

    % split to chunk_size(1) by chunk_size(2) chunks
    X = mat2cell(I, chunk_size(1) * ones(sc(1),1), chunk_size(2) *ones(sc(2),1));

错误:

使用 mat2cell 时出错(第 97 行) 输入参数 D1 到 D2 必须与输入矩阵大小 [1 1285956] 的每个维度相加。'

【问题讨论】:

  • 您希望这段代码做什么? ./ 是逐元素除法运算符。它尝试将 LHS 的每个元素与 RHS 上的 对应 元素分开。这里的关键词是对应的,意思是两个矩阵必须有相同数量的元素和相同的形状。恐怕您的代码甚至无法完成您所描述的操作。我可以建议您现在阅读mathworks.com/help/matlab/matlab_prog/…documentation for ./ 以及基本教程。

标签: matlab


【解决方案1】:

很遗憾,您的代码并没有像您想象的那样工作。

./ 运算符执行两个矩阵的逐点除法。简短示例:

[12, 8] ./ [4, 2] == [12/4, 8/2] == [3, 4]

为了使其工作,两个矩阵必须具有完全相同的大小。在您的情况下,您尝试对 1134x1134 矩阵(图像)和 1x2 矩阵(chunk_size)执行这样的操作。

换句话说,您不能使用它将矩阵划分为更小的矩阵。

但是,解决您的问题的方法是使用 mat2cell 函数来挑选矩阵的子集。可以在此处找到有关如何完成的说明(包括示例):http://se.mathworks.com/matlabcentral/answers/89757-how-to-divide-256x256-matrix-into-sixteen-16x16-blocks

希望对你有帮助:)

【讨论】:

  • 万一该链接有一天中断,我建议您也将解决方案的要点(即使用mat2cell)也纳入您的答案中。
  • @rasan076 我明白了。我已经投票给你的答案。但现在我扩大了我的问题。用我所学到的。你能看看我的问题吗?我想确定我错在哪里。谢谢。
  • @VenSan 请不要这样做,如果您根据所学知识有新问题,请作为新问题提出。
  • @Dan 我明白了。对不起。下次我会问新问题。很抱歉。
【解决方案2】:

C=A./B 命令的后面是循环遍历A(ii,jj,...)B(ii,jj,..) 以及每个C(ii,jj,..)=A(ii,jj,...)/B(ii,jj,...) 的所有元素。

因此,AB 的矩阵必须具有相同的维度。

如果你想将矩阵分成组,你可以使用

sc=cell(1134/3,1);
kk=0;ll=0;
for ii=2:3:1133
 kk=kk+1;
 for jj=2:3:1133
   ll=ll+1;
   sc{kk,ll}=image(ii-1:ii+1,jj-1:jj+1);
 end
end

代码为结果子矩阵和任意计数器kkll 分配元胞数组sc。然后循环遍历iijj,步长为 3,代表每个子矩阵的中心。


编辑

或者您可以使用mat2cell 命令(在matlab shell 中输入help mat2celldoc mat2cell

sc=mat2cell(image,3,3);

在这两种情况下,结果都是元胞数组sc{ii,jj} 可以访问其iith 和jjth 元素(矩阵)。如果你想在kkth 和llth 矩阵中调用iith 和jjth 号码,请通过sc{kk,ll}(ii,jj) 进行。

【讨论】:

  • @Crowley 你能解释一下 ii=2:3:1133 吗,我知道的 ii=2:3 请。
  • @VenSan 答案比较复杂,所以我在另一个问题中展开; stackoverflow.com/questions/36574423/…
  • @VenSan 简而言之,它使用元素 [2,5,8,...,1133] 定义数组,并在每个循环中为 ii 变量分配适当的值。
  • @Crowley 非常感谢。我扩展了程序,但我又遇到了错误。如果你能看一下,我非常感谢。我想确定我在哪里弄错了。非常感谢。
  • @Error using mat2cell(第 97 行)输入参数 D1 到 D2 必须与输入矩阵大小 [1 1285956] 的每个维度相加。'
【解决方案3】:

简而言之,您将 1134 x 1134 除以 2 x 1 矩阵。那是行不通的。

错误“矩阵维度必须一致**”是因为将一个矩阵与另一个没有正确维度的矩阵相除。

您使用了标量除法“./”,它将一个矩阵除以另一个矩阵。

你想要这样的东西:

n = 1134 / 3         % you should measure the length of the image
I1=image(1:n,1:n);   % first row
I2=image(1:n,n:2n);
I3=image(1:n,2n:3n);
I4=image(n:2n,1:n); % second row
I5=image(n:2n,n:2n);
I6=image(n:2n,2n:3n);
I7=image(2n:3n,1:n); % third row
I8=image(2n:3n,n:2n);
I9=image(2n:3n,2n:3n);

从这里: http://au.mathworks.com/matlabcentral/answers/46699-how-to-segment-divide-an-image-into-4-equal-halves

你可以在一个很好的循环中做到这一点,但有时思考很困难。

【讨论】:

  • 至少使用元胞数组而不是用所有这些变量使工作区混乱!此外,OP 想要 3-by-3 矩阵,而不是分成 3 个矩阵,所以你必须在那里达到n...
  • 是的,这是一个粗略的解决方案,它会使工作空间变得杂乱无章。你说的对。但文一开始并不知道如何使用数组。所以可能对他有帮助。我讨厌他在一个数组中处理 9 个数组,作为一个 3 维数组。他正在努力处理二维数组和一维数组。这样一来,我认为原油更好。上升到 'n' 你的意思是上升到 1134? 3n = 1134
  • n 将是 1134/3 但实际上你必须上升到 n^2 这是 142884 所以你需要 150,000 个单独命名的变量......所以在这种情况下原油解决方案甚至不是一种选择。除非我误解了 OP,否则问题非常模棱两可。无论哪种方式,都不应使用此解决方案。元胞数组是 MATLAB 中的基本结构,任何使用该语言的人都需要学习如何使用它们。
  • 不,我想我误解了这个问题。我认为你做对了。我认为元胞数组是 Matlab 作为编程语言最有用的地方。
  • 当我误解了这个问题时,我对获得投票感到尴尬。
猜你喜欢
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 2016-02-15
  • 2021-05-11
相关资源
最近更新 更多