2015-05-22 171 views
0

我的用于直方图均衡的初始代码计算频率(1)至FREQ(254)完全地并计算频率(255)和频率(256)错误地。在freq(255)中的结果与在freq(255)和freq(256)处的实际结果的总和是错误的。和频率(256)始终保持为0。在频率直方图均衡误差(255)频率(256)值

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

MDATA含有所以做我的回答可以帮助您的像素范围从0到255 –

+0

的值不同? – rayryeng

回答

1

最有可能的罪魁祸首是事实,你的形象是uint8和数据类型是饱和的。你是否注意到,你需要1添加强度仓的结果,因为MATLAB开始于指数。然而,索引,当你到强度255,加1应该给你256,但它实际上饱和到255这是为什么在256的bin始终为0,因为你永远不会生成超过255的任何值。

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

因此,为确保您的数据不会溢出,您需要将您的数据转换为一种类型,不饱和8位数据。 double是一个很好的使用类型。因此,简单地把你的mdata并进行直方图均衡化之前,将它转换为double,等:

mdata = double(mdata); 

一旦你这样做,当你运行你的代码,它现在应该工作,你不应该有检查对于手动在强度范围的较高端的那些值。

+0

谢谢!这对我来说非常合适。在这部分代码结束后,我再次必须将mdata转换回uint8才能显示图像。 –

+0

@RajeshKrishnan - 是的。我忘了那一步。好决定。祝你好运! – rayryeng