详解BBHE(图像双直方图均衡)算法
首先看BBHE函数
function [ I2 mu] = BBHE( I1 )
[rows cols]=size(I1);
h1=imhist(I1);
mu=round(mean2(I1));
p1=h1(1:mu+1);
p1=p1/sum(p1);
p2=h1(mu+2:end);
p2=p2/sum(p2);
I2=reshape(I1,[],1);
ind1=I2<=mu;
aa=I2(ind1);
tmp1 = HE4SubHistogram(aa,0,mu,p1);
ind2=I2>mu;
bb=I2(ind2);
tmp2 = HE4SubHistogram(bb,mu+1,255,p2);
I2(ind1)=tmp1;
I2(ind2)=tmp2;
I2=reshape(I2,rows,cols);
end
BBHE函数参数是I1灰阶化的图像矩阵,返回值是处理后的I2图像矩阵和图像灰阶平均值mu
[rows cols]=size(I1);
将I1图像矩阵的行列赋值给rows,cols,以范例图像为例,rows=321,cols=481
h1=imhist(I1);
h1是将I1的所有像素在灰阶0-255的每个值的累计,h1是一个256*1的列向量
h1的直方图如图所示
mu=round(mean2(I1));
mu为所有像素灰阶的平均值,它的值为131
p1=h1(1:mu+1);
p1=p1/sum(p1);
p2=h1(mu+2:end);
p2=p2/sum(p2);
这四行代码是把图片按照灰阶分成两个部分A和B
对A部分进行处理
第一行p1将h1中所有灰阶值在1至mu+1的值排成一个列向量
显然p1的元素等于((mu+1)-1)+1=mu+1=132,此时p1为132x1的列向量
p1是每个灰阶值在A部分对应的频数
第二行将p1所有元素(灰阶值)除像素总数得每个灰阶值在A部分的频率
对B部分同理,p2为一个124x1的列向量,记录每个灰阶值在B部分的频率
I2=reshape(I1,[],1);
接着将I1(321481)矩阵按列重塑为一个(321481)x1即15440x1的I2矩阵
ind1=I2<=mu;
ind1矩阵类型为逻辑矩阵,相当于一个标记矩阵。它将总共15440行元素小于等于mu的标记为1,大于的标记为0
aa=I2(ind1);
接着将I2中元素值小于等于mu的赋值给aa,得到一个64676x1的列向量
aa中存储的是灰阶值在1-mu内每个像素的灰阶值
tmp1 = HE4SubHistogram(aa,0,mu,p1);
执行HE4SubHistogram函数,这个函数的内容为:
function [ I1 ] = HE4SubHistogram(I,I_s,I_e,p)
C=cumsum(p);
f=uint8(I_s+C*(I_e-I_s));
% I1=f(I+1-I_s);
I1=f(uint8(double(I)+1-I_s));
end
可见这个函数的声明为:
function [ I1 ] = HE4SubHistogram(I,I_s,I_e,p)
备注:
I:输入图像aa
I_s:该子直方图的最小灰度值=0
I_e:该子直方图的最大灰度值=mu=131
p:该子直方图内的灰度分布频率(已归一化)=p1
C=cumsum(p);
f=uint8(I_s+C*(I_e-I_s));
C的第i行的值是p的前i-1行之和
第二行将C从0-1按比例放大到1至mu
f的坐标轴是132个灰阶
I1=f(uint8(double(I)+1-I_s));