freq(255)freq(256)值中的直方图均衡错误

时间:2015-05-22 04:52:59

标签: image matlab image-processing

我的直方图均衡化初始代码完美地将freq(1)计算为freq(254)并错误地计算freq(255)和freq(256)。在freq(255)的结果中,错误的是freq(255)和freq(256)的实际结果的总和。并且freq(256)始终保持为0。

    freq=zeros(256,1);
    probf=zeros(256,1);
    probc=zeros(256,1);
    cum=zeros(256,1);
    output=zeros(256,1);
    numofpixels = 1080*1920;
    value = 500;
    %calculating the frequency
    for i=1:1080
        for j=1:1920
            value=mdata(i,j,1);
            freq(value+1)=freq(value+1)+1;                
            probf(value+1)=freq(value+1)/numofpixels;

        end
    end

所以我将初始代码修改为以下代码,其中我单独检查任何像素的值是否为254和255.这非常有效。它背后的原因是什么?

freq=zeros(256,1);
probf=zeros(256,1);
probc=zeros(256,1);
cum=zeros(256,1);
output=zeros(256,1);
numofpixels = 1080*1920;
maximum254 = 0;
maximum255 = 0;
value = 500;
%calculating the frequency
for i=1:1080
    for j=1:1920
        value=mdata(i,j,1);
        if value < 254
        freq(value+1)=freq(value+1)+1;
        end

        if value==254
        freq(255)=freq(255)+1;
        maximum254 = maximum254 +1;
        end

        if value==255
        freq(256)=freq(256)+1;
        maximum255 = maximum255 +1;
        end

        probf(value+1)=freq(value+1)/numofpixels;

    end
end

1 个答案:

答案 0 :(得分:1)

最可能的罪魁祸首是你的图像是uint8并且数据类型是饱和的。您注意到需要将强度加1才能将结果加入,因为MATLAB在索引1处开始索引。但是,当您达到强度255时,添加1应该会给出256,但它实际上饱和这就是为什么256处的bin始终为0,因为你永远不会生成超过255的任何值。

实际发生的是,那些在254处被分箱的值正在与255合并,因为uint8(254+1) = uint8(255+1) = 255。这就是为什么索引254和255的计数错误,而bin 256为0。

因此,为了确保您的数据不会饱和,您需要将数据转换为不会使8位数据饱和的类型。 double是一个很好用的类型。因此,在执行直方图均衡之前,只需将mdata转换为double,即可:

mdata = double(mdata);

执行此操作后,当您运行代码时,它现在应该可以正常工作,您不必手动检查强度范围较高端的值。