直方图的均衡化,难点在于找到一个从原图像灰度值到输出图像灰度值的映射。
这里映射公式和推导过程如下:
这个没什么多说的 直接附源码
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%函数功能:图像直方图均衡化%%%%%
%作者:张小胖新欢是科研%%%%%%%%%
%时间:2013.9.27%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;close all;clc;
src=imread('D:\Documents\Desktop\lenna.JPG'); %%%%%%%读入原图像
[m,n,q]=size(src); %%%%%%%%%%%%%%%%%计算图像大小
dst1=zeros(m,n); %%%%%%%%%%%%%%%%%%%%%%%%%%%创建过渡矩阵
dst=dst1; %%%%%%%%%%%%%%%%%%%%%%%%%%创建均衡化后的空图像
for i=1:m
for j=1:n
dst1(i,j)=0.299*src(i,j,1)+0.587*src(i,j,2)+0.114*src(i,j,3); %%%%%%%%%%%%%%%%%%%%RGB转灰度图,常见有3种算法,用整型数字会更快
end
end
p1=zeros(1,256); %%%%%%%%%%%%%%%%%%创建空矩阵存储各像素值的频数
p2=zeros(1,256);
P=zeros(1,256);
dst1=uint8(dst1); %%%%%%%%%%%%%%%%%%%%将浮点型灰度图转为整型
figure(1);
imshow(dst1);
%%%%%%%%%%%统计各像素值的频数,并存储在p1中%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:m
for j=1:n
a=dst1(i,j);
p1(a+1)=p1(a+1)+1;
end
end
X=0:255;
figure(2)
subplot(1,2,1);plot(X,p1); %%%%%%%%%%%%%%%%显示原图像灰度直方图
p=p1/(m*n); %%%%%%%%%%%%%%%计算原图像灰度概率密度
%%%%%%%%%%%%%计算原图像灰度值的分布函数%%%%%%%%%%%%%%%%%%%%%%
P(1)=p(1);
for b=2:256
P(b)=P(b-1)+p(b);
end
%%%%%%%%%%%%%%%%%均衡化%%%%%%%%%%%%%%%%
for i=1:m;
for j=1:n
c=dst1(i,j);
dst(i,j)=230*P(c+1);
end
end
dst=uint8(dst);
figure(3);
imshow(dst);
%%%%%%%%%%%%%%%%%%%%%计算均衡化后的直方图%%%%%%%%%%%%%%%%
for i=1:m
for j=1:n
a=dst(i,j);
p2(a+1)=p2(a+1)+1;
end
end
Y=0:255;
figure(2)
subplot(1,2,2);plot(Y,p2);
效果如下
原图
均衡化后
直方图对比