直方图均衡化是一种使输出图像直方图近似服从均匀分布的变换算法,其计算步骤如下:
列出原始图像的灰度级 f j f_j fj,j=0,1,…,k,…,L-1,其中L是灰度级的个数。统计各灰度值的像素数目 N j N_j Nj, j=0,1,…,k,…,L-1。计算原始图像直方图各灰度级的频度Pj= N j n \frac{Nj}{n} nNj,j=0,1,2,…,k,…,L-1,其中n为原始图像总的像素数目。计算累计分布函数C(f)= ∑ i = 0 k P j ( f j ) \displaystyle\sum_{i=0}^{k} P_j(f_j) i=0∑kPj(fj),j=0,1,2,…,k,…,L-1。应用以下公式计算映射后的输出图像的灰度级 g i g_i gi,i=0,1,…,k,…,P-1,P为输出图像灰度级的个数: g i g_i gi=INT[ ( g m a x g_{max} gmax- g m i n g_{min} gmin)C(f)+ g m i n g_{min} gmin+0.5 ] 式中,INT为取整符号。统计映射后各灰度级的像素数目 n i n_i ni,i=0,1,…,k,…,P-1。计算输出图像直方图 P g P_g Pg( g i g_i gi)= n i n \frac{n_i}{n} nni,i=0,1,…,k,…,P-1。用 f j f_j fj和 g i g_i gi的映射关系修改原始灰度级,从而获得直方图近似为均匀分布的输出图像。Histogram_equalization.m
function [output] = Histogram_equalization(input_image) if numel(size(input_image)) == 3 %如果图像为rgb图像 %this is a RGB image %here is just one method, if you have other ways to do the %equalization, you can change the following code r=input_image(:,:,1); v=input_image(:,:,2); b=input_image(:,:,3); r1 = hist_equal(r); v1 = hist_equal(v); b1 = hist_equal(b); output = cat(3,r1,v1,b1); else %图像为灰值图像 [output] = hist_equal(input_image); end function [output2] = hist_equal(input_channel) [m,n]=size(input_channel); output2=zeros(m,n); N=zeros(256,1); P=zeros(256,1); C=zeros(256,1); for i=1:m %统计各灰度级个数 for j=1:n N(input_channel(i,j)+1)=N(input_channel(i,j)+1)+1; end end for i=1:256 %计算原始图像直方图各灰度级的频度 P(i)=N(i)/(m*n); end C(1)=P(1); %计算累计分布函数 for i=2:256 C(i)=C(i-1)+P(i); end for i=1:m %通过映射关系获得输出直方图 for j=1:n output2(i,j)=floor(255*C(input_channel(i,j)+1)+0.5); end end output2=uint8(output2); end end代码效果展示
展示代码 test.m
clc; clear; close all; I = imread('d:\test.jpg'); [J] = Histogram_equalization(I); subplot(221), imshow(I); subplot(222), imhist(I); subplot(223), imshow(J); subplot(224), imhist(J);[1] MATLAB数字图像处理.张德丰.扫描版