介绍

图像的直方图事实上就是图像的亮度分布的概率密度函数,是一幅图像的所有象素集合的最基本的统计规律。直方图反映了图像的明暗分布规律,可以通过图像变换进行直方图调整,获得较好的视觉效果。
直方图均衡化是通过灰度变换将一幅图像转换为另一幅具有均衡直方图的图像,即在每个灰度级上都具有相同的象素点数的过程。处理后的图像直方图分布更均匀了,图像在每个灰度级上都有像素点。从处理前后的图像可以看出,许多在原始图像中看不清楚的细节在直方图均衡化处理后所得到的图像中都变得十分清晰。
所谓直方图规定化,就是通过一个灰度映像函数,将原灰度直方图改造成所希望的直方图。所以,直方图修正的关键就是灰度映像函数。
本文采用调用matlab内部函数与自己编写函数,分别进行直方图均衡化与规定化的实现。

使用MATLAB自带函数实现

函数介绍

imhist(f):画出直方图函数
histeq(f):直方图均衡化函数
histeq(f,g2):直方图规定化函数

代码

f=imread('1.jpg');
f1=imread('2.jpg');
g1=imhist(f1);%画出直方图
g2=imhist(f1);
z1=histeq(f);%直方图均衡化
z2=histeq(f,g2);%直方图规定化
z3=histeq(f1);%直方图均衡化

figure
subplot(2,2,1);imshow(f);title('原图像');
subplot(2,2,2);imshow(z1);title('均衡化图像');
subplot(2,2,3);imshow(f1);title('匹配图像');
subplot(2,2,4);imshow(z2);title('匹配后图像');

figure
subplot(2,2,1);imhist(f);title('原图像直方图');
subplot(2,2,2);imhist(z1);title('均衡化图像直方图');
subplot(2,2,3);imhist(f1);title('匹配图像直方图');
subplot(2,2,4);imhist(z2);title('匹配后图像直方图');

输出结果

在这里插入图片描述
在这里插入图片描述

自己编写函数实现

原理

均衡化:建立映射表s,再根据映射表对各个像素进行映射变换。
s ( i ) = ( L − 1 ) ∑ j = 1 i p ( j )   s(i) =(L-1) \sum_{j=1}^ip(j)\, s(i)=(L1)j=1ip(j)
直方图匹配:建立原图像均衡化的映射表s1,再建立匹配图像均衡化映射表s2。通过s1,s2匹配建立最终映射表s3,最后根据映射表对各个像素进行变换。
在这里插入图片描述
A通过s1映射为A1,C通过s2映射为C1。由上图知A1=C1,所以可以由A映射到C。实际上A1里的元素不一定都存在于C1中,当发现元素b属于A1但不属于C1时,找C1中与b最接近的元素进行匹配。

代码

f=imread('1.jpg');
f1=imread('2.jpg');
f1=rgb2gray(f1);
g1=imhist(f);%画出直方图
g2=imhist(f1);

%均衡化
[M,N]=size(f);
pr=g1/M/N;
s=[];
s2=0;
L=size(pr);
for i=1:L           %映射规则
    s1=(L-1)*pr(i);
    s2=s2+s1;
    s=[s;s2];
end
s=s(:,1);

f_1=zeros(size(f));
for i=1:M*N        %映射图像
    f_1(i)=s(f(i));
end
figure
subplot(2,2,1);imshow(f);title('原图像');
subplot(2,2,2);imhist(f);title('原图像直方图');
subplot(2,2,3);imshow(uint8(f_1));title('均衡化图像');
subplot(2,2,4);imhist(uint8(f_1));title('均衡化图像直方图');

%规定化
[M1,N1,R]=size(f1);  %匹配图像均衡化
pr1=g2/M1/N1;
s_1=[];
s2=0;
L=size(pr1,1);
for i=1:L            %映射规则
    s1=(L-1)*pr1(i);
    s2=s2+s1;
    s_1=[s_1;s2];
end
s_1=s_1(:,1);
f_11=zeros(size(f1));

for i=1:M1*N1*R      %被均衡化的匹配图像
    if(f1(i)==0)
        f_11(i)=s_1(1);
    else
        f_11(i)=s_1(f1(i));
    end   
end
figure
subplot(2,2,1);imshow(f1);title('匹配图像');
subplot(2,2,2);imhist(f1);title('匹配图像直方图');
subplot(2,2,3);imshow(uint8(f_11));title('均衡化图像');
subplot(2,2,4);imhist(uint8(f_11));title('均衡化图像直方图');

[M1,N1]=size(f1);  %规定化(映射)
s=uint8(round(s)); %四舍五入取整,原图像映射表
s_1=uint8(round(s_1));%匹配图像映射表
s_2=zeros([L,1]);  %最终映射表
j=1;
for i=1:L   %求最终映射表
    a=find(s_1==s(i));
    if(a)
        if((i>1)&&(a(j)==s_2(i-1)))
            j=j+1;
            if (j>=length(a))
                j=length(a);
            end
        else
            j=1;
        end
        b=a(j);
    else
        b=zhidao_nearest(double(s_1),s(i));
    end 
    s_2(i)=b;
end

f_2=zeros(size(f)); %像素通过映射表匹配
for i=1:M*N
    f_2(i)=s_2(f(i));
end

figure
subplot(2,3,1);imhist(f);title('原图像直方图');
subplot(2,3,2);imhist(f1);title('匹配图像直方图');
subplot(2,3,3);imhist(uint8(f_2));title('匹配后图像直方图');
subplot(2,3,4);imshow(f);title('原图像');
subplot(2,3,5);imshow(f1);title('匹配图像');
subplot(2,3,6);imshow(uint8(f_2));title('匹配后图像');

function y=zhidao_nearest(A,b) %查最接近数的下标
[Asort,index]=sort(abs(A(:)-double(b)));
y=A(index(1));
end

输出结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐