发现大量的单个矩阵的方法。
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和编码,所以任何帮助或建议将不胜感激。
接受的答案
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)
0评论
更多的答案(2)
图像分析
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]和你想要的东西。我将更全面完整的演示,做其他事情也喜欢不同的分辨率和不同的操作(中值、方差等)。万博 尤文图斯