附上按照上述流程实现的MATLAB代码:
clc;close all;clear all;
H= imread('测试图\lena512.bmp');
H=H(:,:,1);
%判断是否为三通道彩色图片 若是 则将其灰度化
if length(size(H))>2
H=rgb2gray(H);
end
%获取图片的尺寸 便于计算总像素数 即m*n
[m,n]=size(H);
%生成一个一行256列的矩阵
p=zeros(1,256);
% 统计各灰度的像素个数
%find(H==i) 是在图像矩阵里面寻找灰度为i的点坐标
% 因为矩阵是从1开始的 所以为p(i+1)
for i=0:255
p(i+1)=length(find(H==i))/(m*n);
end
subplot(2,2,1);
imshow(H);
title('原图');
subplot(2,2,2);
% 显示原图的直方图
bar(0:255,p,'b');
title('原图直方图');
% 利用循环 累加概率值
s=zeros(1,256);
for i=1:256
for j=1:i
s(i)=p(j)+s(i); %分布函数
end
end
%对s中的数先乘以255,再取整
a=round(s*255+0.5);
b=H;
%更新原图像的灰度
for i=0:255
b(H==i)=a(i+1);
end
subplot(2,2,3);
imshow(b)
title('均衡化后图像');
%统计更新后的概率
for i=0:255
GPeq(i+1)=sum(p(a==i));
end
subplot(2,2,4);
bar(0:255,GPeq,'b'); title('均衡化后的直方图');
运行后效果图: 实际上MATLAB自带直方图均衡函数adapthisteq以及灰度直方图显示函数imhist,用自带的函数进行操作,代码如下:
srcImage=imread('lula.jpg');
%转化成灰度图
grayImage=rgb2gray(srcImage);
%在窗口中显示2*2排列图像
subplot(2,3,1);
imshow(grayImage);
title('原图像灰度图');
%绘制灰度直方图
subplot(2,3,2);
imhist(grayImage);
title('灰度直方图');
%对灰度直方图均衡化处理
subplot(2,3,3);
H1=adapthisteq(grayImage);%灰度均衡化
imhist(H1);
title('直方图均衡化');
subplot(2,3,4);
imshow(H1);%显示调整后图像
title('直方图均衡化图像');
效果和自己写的代码类似:
|