使用Python实现Histogram_equalization算法

最近刚来日本忙着生活上的事情,对技术上的研究也有点松懈了.在日本的研究课题是计算机图形学.所以就选修了相关的课程, 最基本的当然是图形处理,老师的第一个任务就是实现 Histogram equalization 算法.中文名字就是直方图均衡化.

# 概念介绍

这里首先讨论的是灰阶的图像,也就是平常大家所有的黑白照片.然后每个颜色都有具体的数值.纯黑色是 0,纯白色是 255. 当然这是对于 8 Bit 的图来说的. 色差的范围只有 0-255.就拿这个作为例子来讲解吧~ 然后就要讲解如何从数值上来分析一张图片是拍的好呢还是不好呢,如果是一张好照片,那这张照片必然是 对比度鲜明,该亮的地方亮,该暗的地方暗.也就是大家所说的曝光合适.然后我们从照片的二进制数据中去读取每个像素的数值,然后画出直方图.发现每个数值的 像素分布比较均匀,就说明这是一张好照片.但是现实生活中,我们可能会拍到一些曝光不足导致整体照片很暗或者曝光过了导致照片过亮的情况.在不能重拍的情况 下只能使用算法来进行优化了,本文就是来说明这个算法的实现的.

# 算法大致概念

算法的本质就是提取每个像素的数值,然后经过计算把每个像素进行替换.每个像素都有经过计算之后的新的数值.新的数值可以使照片整体上的数值分布更均匀. 给人的整体感觉是照片对比度变得很好了.具体的算法解释看 wiki 我解释的比较烂. Histogram_equalization (opens new window)

# 算法实现

根据 wiki 的例子,我用 Py 实现了这个算法,效果还算不错吧.尽可能的少引用类库,不过 opencv 已经有现成实现好的 API 了.但是只支持 Py2,而我用的 Py3. 库的引用只使用了PIL (opens new window)numpy (opens new window).前者用来读取图像的二进制数据, 后者用来进行数值的累加计算.源码发布在 Github (opens new window)

计算机图形学对我来说完全是未知的领域,希望有经验的同学可以不吝指正.