我的代码中有一个奇怪的错误,我似乎无法弄明白。对于上下文,我是一个图像,一个矩阵,由0到255的缩放值组成.GetSpatAvg是一个不包含在这里的函数。我面临的问题是ngtdm中的元素总是最大值为255.当这个函数完成时,我得到的矩阵ngtdm包含许多255的值。代码完全如我在计算机上显示的那样。
function ngtdm = getNGTDM(I,d)
[rowI, colI] = size(I);
ngtdm = zeros(256, 1);
for r=1+d:rowI-d
for c=1+d:colI-d
term = I(r,c)-getSpatAvg(r,c);
ngtdm(I(r,c)+1)=ngtdm(I(r,c)+1)+term;
end
end
end
我在下面的代码中隔离了I,254中的特定值。
function ngtdm = getNGTDM(I,d)
[rowI, colI] = size(I);
ngtdm = zeros(256, 1);
for r=1+d:rowI-d
for c=1+d:colI-d
if(I(r,c)==254)
term = I(r,c)-getSpatAvg(r,c);
disp(term);
ngtdm(I(r,c)+1)=ngtdm(I(r,c)+1)+term;
end
end
end
end
变量'term',在这个例子中总是222.有369个实例的222.因此ngtdm(255)(254 + 1 = 255)的值应该大于255,但元素仍然是最大的当我用222替换术语时,如下所示:
ngtdm(I(r,c)+1)=ngtdm(I(r,c)+1)+222;
我得到正确的值,大于255的数字。
我似乎无法弄清楚为什么我的元素总是在255处达到最大值。这可能与我的值在0到255之间缩放的事实有关。我非常肯定getSpatAvg是不是问题,因为正在返回正确的值。
谢谢
答案 0 :(得分:1)
这不是错误 - 听起来你使用的是uint8
数据类型。如果转换为具有更多位的数据类型 - 例如uint16,uint32,single,double等 - 你不会遇到这个问题。我猜您正在使用图像,因为使用imread
读取的图像默认为uint8
读取以节省内存。最快的修复:在函数开始时使用I=double(I);
,或者在将函数放入函数之前使用变量I。