基于直方图均衡化的图像处理

一般对于曝光过度或则过暗问题,可以采用直方图均衡化算法来对图像进行预处理。

首先了解对灰度的定义
灰度:使用黑色调表示物体,即用黑色为基准色,不同的饱和度的黑色来显示图像。 每个灰度对象都具有从 0%(白色)到灰度条100%(黑色)的亮度值,把有黑-灰-白连续变化的灰度值量化为256个灰度级,灰度值的范围为0~255,表示亮度从深到浅。
在matlab中,当计算机读取一张图片时,实际上读取这张图片的每个像素点的灰度值,储存在一个二维矩阵中(ps:如果是一张灰度图)。
MATLAB读取图像

均衡化过程中,必须要保证两个条件:
1.像素无论怎么映射,一定要保证原来的大小关系不变,较亮的区域,依旧是较亮的,较暗依旧暗,只是对比度增大,绝对不能明暗颠倒;
2.如果是八位图像,那么像素映射函数的值域应在0和255之间的,不能越界。
CDF(累积分布函数),因为CDF是单调增函数(控制大小关系),并且值域是0到1(控制越界问题)。
CDF函数图像

%直方图均衡化
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)简单!代码量和计算量小。占用计算机资源较小。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值