平均每个3 x3的周围的像素矩阵,不包括计数的“局外人”。

8视图(30天)
亲爱的所有,
我有几个134 x134温度数据矩阵两类。
对于每一个像素,我需要计算周围8个像素的平均值(不含中央像素计算)。
我这样做仅仅通过:
MyMtx% 134 x134矩阵
内核= 1 (3,3)/ 8;
内核(2,2)= 0;
bg = nanconv (MyMtx内核,“相同”);
我需要做的是计算平均扣除(设置为南?),每个子矩阵中的值下降外上限和下限,即那些刨丝器比3 x3的平均值+标准偏差矩阵和那些小于3 x3的mean-standard偏差矩阵,分别。
例如,我的子3 x3矩阵:
MySubMtx = [284.536443397838, 285.257928640519, 284.887393876757;
281.380348448367、285.774025332031、284.514456427377;
274.226936908716,278.793284550825,283.871352790957)%注意:中央像素排除在平均(其重量是0)
MySubMtxStd = nanstd (MySubMtx (:))% 3.8919 -注:中央像素被排除在性病
MySubMtxAvg = nanmean (MySubMtx (:))% 282.1835 -注:中央像素必须排除在平均水平
UpperLimit = MySubMtxAvg + MySubMtxStd% 286.0754
LowerLimit = MySubMtxAvg-MySubMtxStd% 278.2916
%这将留给我的平均(如因nanconv)计算这个“残余”矩阵
MySubMtx = [284.536443397838, 285.257928640519, 284.887393876757;
281.380348448367、南284.514456427377;
南,278.793284550825,283.871352790957)
任何帮助炉篦赞赏!
*编辑:
我设法写代码的工作,但它是极其缓慢的。你能帮我修改下面的代码来增强其性能减少其计算时间:
一个=魔法(134);%假设这是我134年x134矩阵
背景=南(大小(A));
Mtx_Siz = 134 * 134;
xmin = 1;
xmax = 3;
ymin = 1;
ymax = 3;
我= 1:Mtx_Siz
如果ymax < 135;
掩码= 0(大小(A));
面具(ymin: ymax xmin: xmax) = 1;
面具(ymax-1 xmax-1) = 0;
jmask =找到(掩码= = 1);
B = (jmask);
B_Mean = nanmean (B);
B_std = nanstd (B);
B_Upper = B_Mean + B_std;
B_Lower = B_Mean-B_std;
jout =找到(B < B_Lower | B > B_Upper);
B (jout) =南;
B_Mean2 = nanmean (B);
B_std2 = nanstd (B);
背景(ymax-1 xmax-1) = B_Mean2;
xmin = xmin + 1;
xmax = xmax + 1;
如果xmax = = 135;
xmin = 1;
xmax = 3;
ymin = ymin + 1;
ymax = ymax + 1;
其他的
结束
其他的
结束
保持背景Mtx_Siz ymin ymax xmin xmax
结束

答案(1)

安东尼尚
安东尼尚 2023年4月14日
编辑:安东尼尚 2023年4月16日15:56
你好,
你可以尝试这样的:
您的代码需要0.9秒到我的笔记本电脑上运行。这需要0.06秒
清晰的所有
抽搐
一个=魔法(134);
[sx, sy] =大小(A);
matMEAN = 0(大小(A));%包含邻近值的均值矩阵
我= 1:sx
j = 1: sy
如果我< sx & & j > > 1 & & 1 & & j < sy%如果指数在中部地区
subMat =(张:我+ 1,j - 1: j + 1);% 3 x3的邻居矩阵
uplim = nanmean (subMat (:)) + nanstd (subMat (:));
lowlim = nanmean (subMat (:)) -nanstd (subMat (:));
B = subMat > lowlim & subMat < uplim;
B (2, 2) = 0;
matMEAN (i, j) =意味着(subMat (B));
其他的%如果在边界
如果我= = 1 & & j = = 1%左上角
subMat =(我+ 1,j: + 1);
uplim = nanmean (subMat (:)) + nanstd (subMat (:));
lowlim = nanmean (subMat (:)) -nanstd (subMat (:));
B = subMat > lowlim & subMat < uplim;
B (1,1) = 0;
matMEAN (i, j) =意味着(subMat (B));
elseif我= = 1 & & j > 1 & & < sy%顶部边界
subMat =(我+ 1,j - 1: j + 1);
uplim = nanmean (subMat (:)) + nanstd (subMat (:));
lowlim = nanmean (subMat (:)) -nanstd (subMat (:));
B = subMat > lowlim & subMat < uplim;
B (1、2) = 0;
matMEAN (i, j) =意味着(subMat (B));
elseifj = = 1 & &我> 1 & & < sx%左边界
subMat =(张:我+ 1,j: + 1);
uplim = nanmean (subMat (:)) + nanstd (subMat (:));
lowlim = nanmean (subMat (:)) -nanstd (subMat (:));
B = subMat > lowlim & subMat < uplim;
B (2, 1) = 0;
matMEAN (i, j) =意味着(subMat (B));
elseifj = = sy > 1 & & & &我< sx%对边界
subMat =(张:我+ 1,j - 1: j);
uplim = nanmean (subMat (:)) + nanstd (subMat (:));
lowlim = nanmean (subMat (:)) -nanstd (subMat (:));
B = subMat > lowlim & subMat < uplim;
B (2, 2) = 0;
matMEAN (i, j) =意味着(subMat (B));
elseif我= = sx & & j > 1 & & < sy%底部边界
subMat = (j - 1张:我:j + 1);
uplim = nanmean (subMat (:)) + nanstd (subMat (:));
lowlim = nanmean (subMat (:)) -nanstd (subMat (:));
B = subMat > lowlim & subMat < uplim;
B (2, 2) = 0;
matMEAN (i, j) =意味着(subMat (B));
elseif我= = sx & & j = = 1%右下角
subMat =(张:i, j: j + 1);
uplim = nanmean (subMat (:)) + nanstd (subMat (:));
lowlim = nanmean (subMat (:)) -nanstd (subMat (:));
B = subMat > lowlim & subMat < uplim;
B (2, 1) = 0;
matMEAN (i, j) =意味着(subMat (B));
elseif我= = sx & & j = = sy%左下角
subMat = A (j - 1张:我:j);
uplim = nanmean (subMat (:)) + nanstd (subMat (:));
lowlim = nanmean (subMat (:)) -nanstd (subMat (:));
B = subMat > lowlim & subMat < uplim;
B (2, 2) = 0;
matMEAN (i, j) =意味着(subMat (B));
elseif我= = 1 & & j = = sy%左上角
subMat =(我+ 1,j - 1: j);
uplim = nanmean (subMat (:)) + nanstd (subMat (:));
lowlim = nanmean (subMat (:)) -nanstd (subMat (:));
B = subMat > lowlim & subMat < uplim;
B (1、2) = 0;
matMEAN (i, j) =意味着(subMat (B));
结束
结束
结束
结束
toc
希望这有助于
2的评论
安东尼尚
安东尼尚 2023年4月16日15:57
是的,你是对的!有一个错误在第一个“如果”声明,我只是eddited代码。

登录置评。

类别

找到更多的在线性代数帮助中心文件交换

s manbetx 845


释放

R2022b

社区寻宝

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

开始狩猎!

翻译的