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


数字图像处理


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

算法思想

计算直方图函数,申请一个全零长度为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('子块部分重叠');

显示结果
直方图均衡化后
全局均衡化后
在这里插入图片描述
感谢观看!

  • 10
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值