OpenCV现实图像全局直方图均衡化

对于直方图的均衡化的实现主要分下面的四个步骤:

第一步:计算图像的灰度直方图。

第二步:计算灰度直方图的累加直方图。

第三步:根据累加直方图和直方图均衡化原理得到输入灰度级和输出灰度级之间的映射关系。

第四步:根据第三步得到的灰度级映射关系,循环得到输出图像的每个像素的灰度级。

具体的python代码实现如下:

# -*- coding:utf-8 -*-

import cv2

import numpy as np

import math

import sys

def calcGrayHist(image):

    #灰度图像矩阵的高和宽

    rows,cols = image.shape

    #存储灰度直方图

    grayHist = np.zeros([256],np.uint64)

    for r in xrange(rows):

        for c in xrange(cols):

            grayHist[image[r][c]] += 1

    return grayHist

 

def equalHist(image):

    #灰度图像矩阵的高和宽

    rows,cols = image.shape

    #第一步:计算灰度直方图

    grayHist = calcGrayHist(image)

    #第二步:计算累加灰度直方图

    zeroCumuMoment = np.zeros([256],np.uint32)

    for p in xrange(256):

        if p == 0:

            zeroCumuMoment[p] = grayHist[0]

        else:

            zeroCumuMoment[p] = zeroCumuMoment[p-1] + grayHist[p]

    #第三步:根据累加灰度直方图得到输入灰度级和输出灰度级之间的映射关系

    outPut_q = np.zeros([256],np.uint8)

    cofficient = 256.0/(rows * cols)

    for p in xrange(256):

        q = cofficient * float(zeroCumuMoment[p]) - 1

        if q >= 0:

            outPut_q[p] = math.floor(q)

        else:

            outPut_q[p] = 0

    #第四步:得到直方图均衡化后的图像

    equalHistImage = np.zeros(image.shape,np.uint8)

    for r in xrange(rows):

        for c in xrange(cols):

            equalHistImage[r][c] = outPut_q[image[r][c]]

    return equalHistImage

 

#主函数

if __name__ == "__main__":

    #读入图像

    I = cv2.imread(sys.argv[1],cv2.CV_LOAD_IMAGE_GRAYSCALE)

    #将图像进行全局直方图均衡化

    O = equalHist(I)

    #显示原图和全局直方图均衡化后的效果

    cv2.imshow("原图",I)

    cv2.imshow("全局直方图均衡化",O)

    cv2.waitKey()

cv2.destroyAllWindows()

 

效果图如下:

经过直方图均衡化后,图像的对比度有显著的提升。直方图均衡化后的结果容易受噪声、阴影和光照变化的影响,其中噪声对所得图像的影响非常大,对于去除图像的噪声方法,后续会介绍如何去除。


aliyun
赵群博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论