0

我的代码中有一个我似乎无法弄清楚的特殊错误。对于上下文,I 是一个图像,一个矩阵,由从 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,但该元素仍最大为 255。当我用 222 替换术语时,如下所示:

ngtdm(I(r,c)+1)=ngtdm(I(r,c)+1)+222; 

我得到了正确的值,一个大于 255 的数字。

我似乎无法弄清楚为什么我的元素总是在 255 时达到最大值。这可能与 I 的值在 0 到 255 之间缩放这一事实有关。我很肯定 getSpatAvg 不是问题因为正在返回正确的值。

谢谢你

4

1 回答 1

1

这不是错误 - 听起来您正在使用uint8数据类型。如果您转换为具有更多位的数据类型 - 例如 uint16、uint32、单、双等 - 您将不会遇到此问题。我猜您正在使用图像,因为默认情况下会读取使用imread的图像uint8以节省内存。最快的解决方法:I=double(I);在函数的开头使用,或者在变量 I 上使用,然后再将其放入函数中。

于 2013-07-17T16:06:44.983 回答