全局直方图均衡处理和局部直方图均衡化处理的比较


数字图像处理


全局直方图均衡处理和局部直方图均衡化处理

算法思想

计算直方图函数,申请一个全零长度为256的向量,存储对应减一的像素值个数。通过遍历原图的每一个像素值,将遍历到的像素值在对应的向量中加1,最后按照向量中的值画出茎杆图为直方图。
全局直方图均衡化,是先将图像各元素的个数进行统计,再求出各像素值的概率,并进行概率对应的归一化,将归一化的概率乘上灰度值,根据原像素值和归一化后的像素值对应,通过find函数找到原来相应的像素改变为现在归一化后的像素,得到均衡化处理的图像。
局部直方图均衡化,分为子块不重叠、子块重叠和子块部分重叠,函数中可选择不同的方法计算。子块不重叠算法根据输入分割子块的大小为n,将图像划分为多块n*n大小的子块,单独对每块进行直方图均衡化;子块重叠算法根据输入分割子块的大小n,利用该分割子块的直方图信息对子块中心的像素进行均衡化,逐一处理完该子块所有像素点;子块部分重叠算法子块是将移动步长约取为子块尺寸的几分之一,子块均衡的灰度值用于映射子块所有像素的灰度值,并记录对多次被均衡的像素,将均衡结果取平均作为该像素在输出图像中的灰度值。

主要程序段

计算直方图的函数

function histgram = histfigure(I)  %灰度直方图
histgram=zeros(256);  %定义灰度值的长度
[h,w]=size(I);
for x=1:w   %从第一列到最后一列
    for y=1:h %从第一行到最后一行
        histgram(I(y,x)+1)=histgram(I(y,x)+1)+1; %统计每个像素的个数
    end
end
stem(histgram(),'.');  %画茎秆
end

直方图均衡化函数

全局直方图均衡化函数
function B= histequaliza(I)   %直方图均衡化,I为图像
[r,c]=size(I);  %,r,c是图像矩阵的行和列数
i=r*c;%矩阵的长度,i也是总的像素数
p=zeros(1,256);    %存储对应像素的概率
s=zeros(1,256);    %均衡化后的概率
for j=0:255
   p(j+1)=length(find(I==j))/i;  %统计像素数为j的概率 
end
s(1)=p(1);
for j=2:256
        s(j)=p(j)+s(j-1);  %均衡化后图像的概率
end
a=round(s*255);
B=I;
for j=0:255
   B(find(I==j))=a(j+1);  %找出I原像素的值,将均衡化的值对应存储到B中
end
end

局部直方图均衡化函数

function hI = localhisteq(I,a,n)
%I是原图,a为1是子块不重叠的局部直方图均衡化,2是子块重叠,3是子块部分重叠
%n是子块分割的大小
[h,w]=size(I);
hI=zeros(h,w);
switch a
    case 1
        hI=blkproc(I,[n n],@histequaliza);
    case 2
        image=I;
        m=n/2;
        hh=h+n;
        ww=w+n;
        ff=zeros(hh,ww);  %对边缘进行扩充
        ff(m+1:hh-m,m+1:ww-m)=image;
        ff(1:m,m+1:ww-m)=image(1:m,:);
        ff(hh-m+1:hh,m+1:ww-m)=image(h-m+1:h,:);
        ff(:,ww-m+1:ww)=ff(:,ww+1-m*2:ww-m);
        for i=m+1:hh-m    %均衡化子块,映射到子块所有像素的灰度值
            for j=m+1:ww-m
                lwc=histequaliza(ff(i-m:i+m,j-m:j+m));
                hI(i-m,j-m)=lwc(m+1,m+1); %实现对子块中心像素点的均衡化处理
            end
        end
    case 3
        image=I;
        m=n/2;
        hh=h+n;
        ww=w+n;
        ff=zeros(hh,ww);  %对边缘进行扩充
        ff(m+1:hh-m,m+1:ww-m)=image;
        ff(1:m,m+1:ww-m)=image(1:m,:);
        ff(hh-m+1:hh,m+1:ww-m)=image(h-m+1:h,:);
        ff(:,ww-m+1:ww)=ff(:,ww+1-m*2:ww-m);
        sumf=zeros(hh,ww);
        num=zeros(hh,ww);
        for i=m+1:8:hh-m
            for j=m+1:8:ww-m %均衡化子块,并映射到子块所有像素的灰度值
                lwc=histequaliza(ff(i-m:i+m,j-m:j+m));%计算子块的局部直方图均衡
                sumf(i-m:i+m,j-m:j+m)=sumf(i-m:i+m,j-m:j+m)+lwc;%均衡化结果累加
                num(i-m:i+m,j-m:j+m)=num(i-m:i+m,j-m:j+m)+1;%记录被均衡化的次数
            end
        end
        hI(:,:)=sumf(m+1:hh-m,m+1:ww-m);
        hI(:,:)=hI(:,:)./num(m+1:hh-m,m+1:ww-m); %将均衡结果取平均值
end
End

测试代码

%全局直方图均衡化
I=imread("lena.bmp");
figure;subplot(221);histfigure(I);title('直方图统计');
subplot(223);imshow(I);title('原图');
histI=histequaliza(I);
subplot(222);histfigure(histI);title('均衡化后的直方图');
subplot(224);imshow(histI);title('均衡化后的图像');

%局部直方图均衡化
I=imread("lena.bmp");
figure;subplot(241);histfigure(I);title('直方图统计');
subplot(245);imshow(I);title('原图');

rI1=localhisteq(I,1,32);
rI1=uint8(rI1);
subplot(242);histfigure(rI1);title('子块不重叠均衡化后的直方图');
subplot(246);imshow(rI1);title('子块不重叠均衡化后的图');

rI2=localhisteq(I,2,32);
rI2=uint8(rI2);
subplot(243);histfigure(rI2);title('子块重叠');
subplot(247);imshow(rI2);title('子块重叠');

rI3=localhisteq(I,3,32);
rI3=uint8(rI3);
subplot(244);histfigure(rI3);title('子块部分重叠');
subplot(248);imshow(rI3);title('子块部分重叠');

显示结果
直方图均衡化后全局直方图均衡处理和局部直方图均衡化处理的比较_第1张图片
全局均衡化后
全局直方图均衡处理和局部直方图均衡化处理的比较_第2张图片
感谢观看!

你可能感兴趣的:(数字图像处理,图像处理,matlab)