我的直方图均衡化初始代码完美地将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
答案 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);
执行此操作后,当您运行代码时,它现在应该可以正常工作,您不必手动检查强度范围较高端的值。