发现大量的单个矩阵的方法。

2视图(30天)
作为一个图像处理任务的一部分,我把944 x752(灰度)图像分成11092 8×8矩阵。我试着使用下面的for循环单独计算和存储每个矩阵的方法:
开始= 0;
停止= 11091;
细胞=开始:1:停止
m =非常刻薄([“out_”int2str(细胞)]);
eval ([“xbar_”int2str(细胞)' = m '])
结束
这是想出的结果,但是数字是完全错误的,例如如果我手动输入;
k =非常刻薄(out_3953)
然后k = 148.3594,但是如果我调用相应的8×8块的结果由我的for循环,结果是81.375。
我新Matlab和编码,所以任何帮助或建议将不胜感激。
1评论
Stephen23
Stephen23 2017年2月17日
编辑:Stephen23 2017年2月17日
“任何帮助或建议将不胜感激
动态访问变量将是缓慢的,车和复杂。如果你想写快速、高效和容易调试代码然后不要试图创建和访问变量。
学习使用索引。真的就是这么简单。ND数组是伟大的,易于使用。细胞阵列也容易。为什么选择最慢的车,最混淆的方式编写代码吗?

登录置评。

接受的答案

Guillaume
Guillaume 2017年2月17日
编辑:Guillaume 2017年2月17日
你真的有编号的变量的 out_11091 吗?哇!
在这个论坛中,我们不断告诉人们不要使用 eval 为了避免这个问题。一旦你开始编号的变量,你做错了。非常错误的如果你的数字一直到11091年。使用数组变量(单元阵列)或更高维度的矩阵来存储所有这些相关的变量。
在你的例子:
% someimage:二维矩阵,可以均匀地分成8×8块
断言(所有(mod(大小(someimage), 8) = = 0),的形象不能被均匀地分为8×8块的)
块= mat2cell (someimage repmat(8、1、大小(someimage 1) / 8), repmat(8 1大小(someimage, 2) / 8)%将图像分成8×8块。块存储到单元阵列
xbar = 0(大小(块));%提前为更快的代码
ib = 1:元素个数(块)
xbar (ib) =非常刻薄(块{ib});
结束
看到循环是多么容易。你甚至不需要循环使用 cellfun :
%不需要提前声明xbar cellfun创建的因为它是
xbar = cellfun (@mean2、块);
编辑: 或者正如亚当建议而不是单元阵列使用3 d矩阵。容易获得的 单元阵列
blocks3D =猫({}):3块;
然后的意思是:
xbar =平均(平均(blocks3D, 1), 2);
这是你的缺点松散的形状块矩阵。你总是可以 重塑 xbar之后:
xbar =重塑(xbar、大小(someimage) / 8)

更多的答案(2)

亚当
亚当 2017年2月17日
把你的8 * 8图像到一个11092 * 8 * 8双数组而不是11092个独立的变量,这是疯了!
然后像如计算方法简单。
平均(平均(myArray, 2), 3);

图像分析
图像分析 2017年2月17日
图像处理人们会使用blockproc ()。你可以用2行代码如果你有图像处理工具箱。这里有一个从我的演示片段:
%块处理图像中的每一个像素都取代
% 4×4像素的均值像素块的块。
% 256像素图像会给256/4 = 64块。
%注意输出块的大小(2×2)不需要输入块的大小!
%的形象将是128 x 128由于我们使用的(2,2)所以为每个64块
%会有一块2×2的输出像素,给一个输出大小为64 * 2 = 128。
%我们仍将有64块但是每个块只会2输出像素,
%即使我们搬到步骤4像素的输入图像。
meanFilterFunction = @ (theBlockStructure)非常刻薄(theBlockStructure.data(:)) * 1(2 2类(theBlockStructure.data));
blockSize = 4 [4];
blockyImage64 = blockproc (grayImage blockSize meanFilterFunction);
对于你的情况,更换blockSize[8]和你想要的东西。我将更全面完整的演示,做其他事情也喜欢不同的分辨率和不同的操作(中值、方差等)。万博 尤文图斯

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!