CrazyBingo

直方图均衡再次—憋命进一步优化

0
阅读(4679)

直方图均衡再次—憋命进一步优化

在上一篇博文中,Bingo总结了整形运算的直方图均衡公式,如下所示:

 

image

实际上第一步、第二步可以一步完成,即小于K就累加,用Matlab实现如下:

%------------------------------------------------
%【2】计算每个灰阶出现的累积个数,并绘制直方图
Gray_Accu = zeros(1,256); 
for i = 1 : h
    for j = 1 : w
            for k = 0 : 255
                if(k >=  IMG1(i,j))
                    Gray_Accu(k+1) = Gray_Accu(k+1) + 1;
                else
                    Gray_Accu(k+1) = Gray_Accu(k+1);
                end
            end
    end
end
subplot(2,2,2);  
bar(0:255,Gray_Accu,'b');       %绘制直方图
xlim([0 255]);              %将横坐标限定在0~255,xlim('auto'); 
title('处理钱的累积直方图');
xlabel('灰阶');
ylabel('累积次数 ');


执行显示原始的Night图,以及灰阶累积的直方图,如下所示:

clip_image008

此时可以直接进行直方图均衡,因为我们已经得到了灰阶累积数据Gray_Accu。首先简化前面我得到的公式,在上一篇博客中,我们使用如下语句实现:


IMG2(i,j) = floor(Gray_Accu(IMG1(i,j)+1)*255/(h*w)); 

首先进行简单的改变一下,其实相差不到,如下:由于在FPGA中我们已经了图像的分辨率,比如640*480的图像,因此这里可以直接将公示改变如下:



IMG2(i,j) = floor(Gray_Accu(IMG1(i,j)+1)/(640*480/255
		 =floor(Gray_Accu(IMG1(i,j)+1) /1205
所以这里我们可以改变为移位,不够由于在FPGA中我们已经了图像的分辨率,比如640*480的图像,因此这里可以直接将公示改变如下:


%------------------------------------------------
%【3】基于灰阶累积的直方图均衡化:[h,w] = [480,640]
IMG2 = zeros(h,w);
for i = 1 : h
    for j = 1 : w
%             IMG2(i,j) = floor(Gray_Accu(IMG1(i,j)+1)*255/(h*w));   %拉伸到【0,255】
            IMG2(i,j) = floor(Gray_Accu(IMG1(i,j)+1)/(1205);   %拉伸到【0,255】
    end
end
subplot(2,2,3);
imshow(uint8(IMG2));    %显示最终的图像
title('均衡后图像 ');


此时得到的图像,以及在此给出该图像的灰阶累积直方图,如下所示:

clip_image010

所以,我们在总结一下直方图均衡的公示,如下: