Python学习之直方图均衡化原理详解

作者:MrWinter 时间:2022-03-06 19:08:07 

1.点算子

点算子是两个像素灰度值间的映射关系,属于像素的逐点运算,相邻像素不参与运算。点算子是最简单的图像处理手段,如:亮度调整、对比度调整、颜色变换、直方图均衡化等等。

2.线性灰度变换

线性灰度变换表达为:

Python学习之直方图均衡化原理详解

其中rk、sk分别为输入、输出点像素灰度值。

Python学习之直方图均衡化原理详解

▲图2.1 线性灰度变换

当a>1时,输出图像像素灰度范围扩大,图像对比度增强,当a<1时反之。这是因为人眼不易区分相近的灰度值,因此若图像灰度值范围较小,观感上细节不够清晰。当a=1、b≠0时,点算子使图像灰度整体上移或下移,即整体变亮或变暗。

Python学习之直方图均衡化原理详解

▲图2.2 图像对比度(左为弱对比度,右为强对比度)

3.直方图均衡化

下图再次给出了关于图像对比度的例子。

Python学习之直方图均衡化原理详解

▲图3.1 图像对比度示例

直方图均衡化是以累计分布函数为核心,将原始图像灰度直方图从比较集中的某个灰度区间,非线性地映射为在全部灰度范围内的较均匀分布,从而增强对比度。

下面阐述直方图均衡化的数学原理。首先作原始图像灰度的概率直方图如图。

Python学习之直方图均衡化原理详解

▲图3.2 直方图均衡化原理

设输入像素灰度值为rk,累计分布函数为

Python学习之直方图均衡化原理详解

其中ni为图像中灰度值为ri的像素频数,n为图像像素总数。设输出像素灰度值为sk,像素范围为smin-smax。期望输出灰度直方图是均匀分布,即

Python学习之直方图均衡化原理详解

令C(sk)=C(rk),即得

所以最终直方图均衡化的点算子为

Python学习之直方图均衡化原理详解Python学习之直方图均衡化原理详解

所以最终直方图均衡化的点算子为

Python学习之直方图均衡化原理详解

4.代码实战

按照前文的原理编写累积分布函数计算公式,以及均衡化算子

# 计算累计分布函数
def C(rk):
  # 读取图片灰度直方图
  # bins为直方图直方柱的取值向量
  # hist为bins各取值区间上的频数取值
  hist, bins = np.histogram(rk, 256, [0, 256])
  # 计算累计分布函数
  return hist.cumsum()
# 计算灰度均衡化映射
def T(rk):
  cdf = C(rk)
  # 均衡化
  cdf = (cdf - cdf.min()) * (255 - 0) / (cdf.max() - cdf.min()) + 0
  return cdf.astype('uint8')

均衡化时直接调用函数即可,下面给出完整代码

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

# 计算累计分布函数
def C(rk):
  # 读取图片灰度直方图
  # bins为直方图直方柱的取值向量
  # hist为bins各取值区间上的频数取值
  hist, bins = np.histogram(rk, 256, [0, 256])
  # 计算累计分布函数
  return hist.cumsum()

# 计算灰度均衡化映射
def T(rk):
  cdf = C(rk)
  # 均衡化
  cdf = (cdf - cdf.min()) * (255 - 0) / (cdf.max() - cdf.min()) + 0
  return cdf.astype('uint8')

# 读取图片
img = cv.imread('1.png', 0)
# 将二维数字图像矩阵转变为一维向量
rk = img.flatten()

# 原始图像灰度直方图
plt.hist(rk, 256, [0, 255], color = 'r')
cv.imshow("原图像",img)

# 直方图均衡化
imgDst = T(rk)[img]
cv.imshow("直方图均衡化后的图像",imgDst)
plt.hist(imgDst.flatten(), 256, [0, 255], color = 'b')

plt.show()

看看效果:

Python学习之直方图均衡化原理详解

▲图4.1 直方图均衡化效果(灰度直方图)

Python学习之直方图均衡化原理详解

▲图4.2 均衡化前

Python学习之直方图均衡化原理详解

▲图4.3 均衡化后

来源:https://mp.weixin.qq.com/s/mjKwCoz67bosMkD7GsI_OQ

标签:Python,直方图,均衡化
0
投稿

猜你喜欢

  • 如何处理包含JavaScript语句时的间隔符?

    2009-11-14 20:39:00
  • 滑动门代码 兼容IE7 IE6 FireFox Opera

    2008-06-07 13:56:00
  • 社会化音乐:在夹缝中生出花来

    2009-08-24 12:37:00
  • ASP教程:0177:800401f3错误解决

    2008-08-02 12:41:00
  • Oracle数据库的安全策略

    2010-07-31 13:13:00
  • block 和 inline 的区别是?

    2009-12-08 13:00:00
  • Python读写ini文件的方法

    2022-01-19 20:58:42
  • 学习ASP.NET八天入门:第三天

    2007-08-07 13:30:00
  • html中的sub与sup标签

    2009-03-06 13:12:00
  • Active Server Pages 错误 “ASP 0141”

    2009-08-19 17:10:00
  • Perl中的正则表达式介绍

    2023-08-11 21:14:25
  • Persits AspJpeg组件图片水印\\缩略图\\图片合并\\图片切割\\实例教程

    2008-12-14 10:36:00
  • 详解Python用三种方式统计词频的方法

    2021-02-10 13:30:12
  • 求某数以内的所有质数的js算法

    2008-01-06 15:49:00
  • javabean servlet jsp实现分页功能代码解析

    2023-06-13 15:21:24
  • win10下python3.5.2和tensorflow安装环境搭建教程

    2022-11-05 15:56:21
  • php header功能的使用

    2023-11-15 09:25:26
  • asp中isNull(str), isEmpty(str)和str=""的区别

    2008-02-15 13:10:00
  • Php header()函数语法及使用代码

    2023-09-04 13:32:20
  • Python xml、字典、json、类四种数据类型如何实现互相转换

    2023-10-17 17:36:20
  • asp之家 网络编程 m.aspxhome.com