图像处理(四)
直方图均衡化
0____前言
直方图操作是图像处理中的一个基本工具。从观察一些图像的直方图中我们可以发现,在暗图像中 ,大多数直方图灰度容集在灰度低端;类似的在亮图像的直方图中,大多数直方图灰度容集在灰度级的高端。直方图均衡化就是通过计算每一灰度级数出现的概率,并将得到的概率前缀和映射到原图像中的过程,此处介绍的是最基本的基于全图像的均衡化的HE(直方图均衡化)算法,之后会继续介绍AHE(自适应直方图均衡化)与CLAHE(限制对比度直方图均衡)。
1____算法流程
- 读入图像预处理
- 统计每个灰度级数在图像中出现的次数
- 计算每个灰度级数于总像素的概率,并统计数组的前缀和
- 将得到的前缀和映射到原图像数组中
2____MATLAB实现
clc;
close all;
clear all;
% 读入,预处理
im = imread('p21.png');
imgray = rgb2gray(im);
figure;
subplot(2,2,1);
imshow(imgray);
% 统计每个灰度级数
hist = zeros(1,256);
[n,m] = size(imgray);
% 后面要+1因为图像的范围是在0~255,但是matlab的数组是从1开始映射的
for i = 1:1:n
for j = 1:1:m
hist( imgray(i,j)+1 ) = hist( imgray(i,j) +1) + 1;
end
end
subplot(2,2,2);
bar(hist);
% 求分布概率前缀和
pro = zeros(1,256);
sumim = sum(hist)
pro(1) = hist(1)/sumim;
for i = 2:1:256
pro(i) = pro(i-1)+hist(i)/sumim;
end
% 灰度映射
transim = zeros(n,m);
for i = 1:1:n
for j = 1:1:m
transim(i,j) = pro(imgray(i,j))*255 + 0.5;
end
end
transim = uint8(transim);
subplot(2,2,3);
imshow(transim);
subplot(2,2,4);
imhist(transim);