直方图均衡化图片

  |     |  
阅读次数:

直方图均衡化

  • 1.实验原理

    用直方图变换方法进行图像增强,通过改变图像的直方图来概念图像中像素的灰度,以达到图像增强的目的。

  • 2.实验步骤

    1、对图像进行灰度统计,求灰度统计直方图。

    2、对灰度统计直方图进行归一化。

    3、求累积分布函数,求累积分布直方图。

    4、对累积直方图各项进行取整扩展tk=int[(L-1)tk + 0.5].

    5、确定映射对应关系,根据映射关系计算均衡化直方图。

  • 3.代码

代码采用python2.0实现

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/10/15 18:49
# @Author  : Jasontang
# @Site    : 
# @File    : histequa.py
# @ToDo    : 直方图均衡化(8bit)


from PIL import Image
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

mpl.rcParams['font.sans-serif'] = "SimHei"
mpl.rcParams['axes.unicode_minus'] = False


def image2vector():
    return np.array(Image.open("images/lena512.bmp", "r").convert("L"))


def equalization(data):
    # 得到图像的高度、宽度
    h = data.shape[0]
    w = data.shape[1]
    # 灰度数组
    grayArr = np.zeros(255)
    # 进行像素灰度统计
    for i in range(h):
        for j in range(w):
            grayArr[data[i][j]] += 1
    print grayArr.shape, grayArr.max()
    # 归一化
    idx = 0
    for item in grayArr:
        grayArr[idx] = item / (h * w)
        idx += 1
    # print grayArr
    cdf = np.zeros(grayArr.shape)
    sum = 0
    # 计算灰度分布密度
    # print cdf.shape
    for i in range(len(grayArr)):
        sum += grayArr[i]
        cdf[i] = sum
    L = 255
    # print cdf
    # 累计分布取整
    indexArr = ((L - 1) * cdf + 0.5).astype(np.uint8)
    # print indexArr
    # 对灰度值进行映射(均衡化)
    for i in range(h):
        for j in range(w):
            data[i, j] = indexArr[data[i, j]]
    return grayArr, cdf, data


if __name__ == '__main__':
    data = image2vector()
    # print data.shape
    plt.figure(figsize=(7, 9))
    plt.subplot(321)
    plt.title(u"原始图像")
    plt.imshow(data, cmap='gray')
    plt.subplot(322)
    plt.title(u"原始灰度")
    plt.hist(data.flatten(), normed=True, bins=256)
    srcGray, cdf, equlArr = equalization(data)
    plt.subplot(323)
    plt.title(u"归一化直方图")
    plt.hist(srcGray, 255)
    plt.subplot(324)
    plt.title(u"累积直方图")
    plt.hist(cdf, 255)
    plt.subplot(325)
    plt.title(u"均衡化图像")
    plt.imshow(equlArr, cmap='gray')
    plt.subplot(326)
    plt.title(u"均衡化的直方图")
    plt.hist(equlArr.flatten(), normed=True, bins=256)
    # print equlArr
    plt.tight_layout(0.3, rect=(0, 0, 1, 0.92))
    plt.show()
  • 4.实验结果
    实验结果
  • 5.实验总结

    在对数据进行归一化的时候,是用每个灰度值除以像素总数。在最后通过映射关系计算均衡化直方图时,是借助求出的映射关系,直接对原图的像素点进行映射。通过均衡化能增强图像的动态范围偏小的图像的反差,达到增强图像整体对比度的效果。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器