一般对于曝光过度或则过暗问题,可以采用直方图均衡化算法来对图像进行预处理。
首先了解对灰度的定义
灰度:使用黑色调表示物体,即用黑色为基准色,不同的饱和度的黑色来显示图像。 每个灰度对象都具有从 0%(白色)到灰度条100%(黑色)的亮度值,把有黑-灰-白连续变化的灰度值量化为256个灰度级,灰度值的范围为0~255,表示亮度从深到浅。
在matlab中,当计算机读取一张图片时,实际上读取这张图片的每个像素点的灰度值,储存在一个二维矩阵中(ps:如果是一张灰度图)。
均衡化过程中,必须要保证两个条件:
1.像素无论怎么映射,一定要保证原来的大小关系不变,较亮的区域,依旧是较亮的,较暗依旧暗,只是对比度增大,绝对不能明暗颠倒;
2.如果是八位图像,那么像素映射函数的值域应在0和255之间的,不能越界。
CDF(累积分布函数),因为CDF是单调增函数(控制大小关系),并且值域是0到1(控制越界问题)。
%直方图均衡化
I = imread('灰度.png');
[height,width] = size(I);
figure
subplot(221)
imshow(I)%显示原始图像
subplot(222)
imhist(I)%显示原始图像直方图
%进行像素灰度统计;
NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级
for i = 1:height
for j = 1: width
NumPixel(I(i,j) + 1) = NumPixel(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一
end
end
%计算灰度分布密度
ProbPixel = zeros(1,256);
for i = 1:256
ProbPixel(i) = NumPixel(i) / (height * width * 1.0);
end
%计算累计直方图分布
CumuPixel = zeros(1,256);
for i = 1:256
if i == 1
CumuPixel(i) = ProbPixel(i);
else
CumuPixel(i) = CumuPixel(i - 1) + ProbPixel(i);
end
end
%累计分布取整
CumuPixel = uint8(255 .* CumuPixel + 0.5);
%对灰度值进行映射(均衡化)
for i = 1:height
for j = 1: width
I(i,j) = CumuPixel(I(i,j));
end
end
subplot(223)
imshow(I)%显示处理后的图像
subplot(224)
imhist(I)%显示处理后的图像直方图
imwrite(I,'chuli.png');
运行结果:
可以根据灰度直方图直观的看出,经过处理后的图片的灰度值相比原图像呈现更加均匀分布,所以处理图像的对比度增强。
直方图均衡化通过累积分布函数对灰度值进行调整,以实现对比度增强的。但是该算法也有一定的局限性:
(1)变换后的图像的灰度级减少,某些细节消失;
(2)在某种特定条件下,直方图有高峰,处理后的图像的对比度不自然的过分增强。
但是直方图均衡化也有明显的优势:
(1)直方图均衡化是一个完全可逆的操作,这对于原始模型的保护是很重要的。
(2)简单!代码量和计算量小。占用计算机资源较小。