直方图均衡化

目的

直方图均衡的目的是使图像灰度间距拉开或使灰度分布均匀,从而增大对比度,使图像细节清晰,实现图像空间增强

原理

基本思想是把原始图的直方图变换为在整个灰度 范围均匀分布的形式,增加像素值的动态范围。
对于图像直方图,用概率密度PDF代替频率:
P r ( r k ) = n k n , k = 0 , 1 , 2 , ⋯   , L − 1 Pr(r_k)= \frac{n_k}{n},k=0,1,2,\cdots,L-1 Pr(rk)=nnk,k=0,1,2,,L1
转化均匀分布的形式需要一个变换函数,即增强 函数T,且满足2个条件:

  1. 单值但增函数
  2. 对应0 ≤ \leq r ≤ \leq L-1,有0 ≤ \leq T ( r ) T(r) T(r) ≤ \leq L-1

累积分布函数CDF满足上述2个条件并能将图像灰 度值由原始分布转化为均匀分布:
P ( r k ) = ∑ j = 0 k p r ( r j ) = ∑ j = 0 k n k n , k = 0 , 1 , 2 , ⋯   , L − 1 P(r_k)=\sum_{j=0}^{k}{p_r(r_j)}=\sum_{j=0}^{k}{\frac{n_k}{n}}, \quad k=0,1,2,\cdots,L-1 P(rk)=j=0kpr(rj)=j=0knnk,k=0,1,2,,L1
变换函数用于直方图累积分布:
s k = T ( r k ) = D m ∑ j = 0 k ( n j n ) , k = 0 , 1 , 2 , ⋯   , L − 1 s_k=T(r_k)=D_m\sum_{j=0}^{k}(\frac{n_j}{n}),\quad k=0,1,2,\cdots ,L-1 sk=T(rk)=Dmj=0k(nnj),k=0,1,2,,L1
确保:

  1. 防止变换后图像出现反转灰度级;
  2. 变换前后灰度值动态范围一致性。

算法

在这里插入图片描述

  1. 概率:
    p r ( r k ) = n k n , k = 0 , 1 , 2 , ⋯   , L − 1 p_r(r_k)=\frac{n_k}{n},\quad k=0,1,2,\cdots,L-1 pr(rk)=nnk,k=0,1,2,,L1
  2. 累积分布函数
    P ( r k ) = ∑ j = 0 k p r ( r j ) = ∑ j = 0 k n k n , k = 0 , 1 , 2 , ⋯   , L − 1 P(r_k)=\sum_{j=0}^{k}p_r(r_j)=\sum_{j=0}^{k}{\frac{n_k}{n}},\quad k=0,1,2,\cdots,L-1 P(rk)=j=0kpr(rj)=j=0knnk,k=0,1,2,,L1
  3. 使用变换函数
    s k = T ( r k ) = D m ∑ j = 0 k n j n , k = 0 , 1 , 2 , ⋯   , L − 1 s_k=T(r_k)=D_m\sum_{j=0}^{k}\frac{n_j}{n},\quad k=0,1,2,\cdots,L-1 sk=T(rk)=Dmj=0knnj,k=0,1,2,,L1
  4. s k s_k sk四舍五入,如果有相同的 ⌈ s k ⌉ \lceil s_k \rceil sk,则合并。

在这里插入图片描述
在这里插入图片描述

代码实现

算法实现

myhisteq.m

function [g] = myhisteq(f)
[m, n] = size(f);
count = zeros(1, 256);
%% 统计每个灰度值出现的次数
for i = 1 : m
    for j = 1 : n
        count(1, f(i, j) + 1) = count(1, f(i, j) + 1) + 1;
    end
end
%% 计算每个灰度出现的概率
p = zeros(1, 256);
for i = 1 : 256
    p(1, i) = count(1, i) / (m*n);
end
%% 计算累计分布概率
t = zeros(1, 256);
t(1, 1) = p(1, 1);
for i = 2 : 256
    t(1, i) = t(1, i-1) + p(1, i);
end
%% 计算分布函数
T = zeros(1, 256);
for i = 1 : 256
    T(1,i) = t(1, i) * 255;
end
%% 四舍五入取整
T =  round(T);
%% 灰度映射
g = double(f);
for i = 1 : m
    for j = 1 : n
        g(i, j) = T(1, g(i, j) + 1);
    end
end
g = uint8(g);

说明:代码还可以进行优化。
测试代码

f = imread('seed-1.jpg');
subplot(2,2,1);
imshow(f);
title('原始图像');
subplot(2,2,2);
imhist(f);
title('直方图');
subplot(2,2,3);
g = myhisteq(f);
imshow(g);
title('均衡化后的结果')
subplot(2,2,4);
imhist(g);
title('均衡化后的直方图');

结果显示
在这里插入图片描述

matlab自带函数

histeq(g),其中g是灰度图像

测试代码

f = imread('seed-1.jpg');
subplot(2,2,1);
imshow(f);
title('原始图像');
subplot(2,2,2);
imhist(f);
title('直方图');
subplot(2,2,3);
g = histeq(f);
imshow(g);
title('均衡化后的结果')
subplot(2,2,4);
imhist(g);
title('均衡化后的直方图');

结果显示
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值