OpenCV的直方图正规化

灰度直方图的正规化主要是将图片的灰度级拉伸到0~255之间。由于部分图像的灰度级主要集中在0~255的部分区间上,这样会导致图像的对比度偏低,通过将直方图正规化,可以使正规化后的图像更加的清晰。

下面是python实现灰度直方图的正规化实现代码,其中直方图正规化需要计算出原图中出现的最大灰度级和最小灰度级,Numpy的函数maxmin可以计算出ndarray的最大值和最小值。

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

import cv2

import numpy as np

import sys

import matplotlib.pyplot as plt

#主函数

if __name__ == "__main__":

    #读入图像信息

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

    #I的最大值和最小值

    Imax = np.max(I)

    Imin = np.min(I)

    #要输出的最小灰度级和最大灰度级

    Omin = 0

    Omax = 255

    #计算ab的值

    a = float(Omax - Omin)/(Imax - Imin)

    b = Omin - a*Imin

    #矩阵的线性变换

    O = a*I + b

    #数据类型转换

    O = O.astype(np.uint8)

    #显示原图和直方图正规化的效果

    cv2.imshow("原图",I)

    cv2.imshow("直方图正规化图",O)

   

    #第一个灰度直方图

    plt.figure(1)

    #获取原图像矩阵的高和宽

    rows,cols = I.shape

    #将二维图像矩阵变为一维数组,这样便于计算灰度直方图

    pixelSequence = I.reshape([rows*cols,])

    #组数

    numberBins = 256

    #计算灰度直方图

    histogram,bins,patch = plt.hist(pixelSequence,numberBins,facecolor='black',histtype='bar')

    #设置坐标轴的名称

    plt.xlabel(u'gray Level-1')

    plt.ylabel(u'number of pixels')

    #设置坐标轴的范围

    y_maxValue = np.max(histogram)

    plt.axis([0,255,0,y_maxValue])

   

    #第二个灰度直方图

    plt.figure(2)

    #获取直方图正规化后图像矩阵的高和宽

    rows_zq,cols_zq = O.shape

    pixelSequence_zq = O.reshape([rows_zq*cols_zq,])

    histogram_zq,bins_zq,patch_zq = plt.hist(pixelSequence_zq,numberBins,facecolor='black',histtype='bar')

    #设置坐标轴的名称

    plt.xlabel(u'gray Level-2')

    plt.ylabel(u'number of pixels')

    y_maxValue_zq = np.max(histogram_zq)

    plt.axis([0,255,0,y_maxValue_zq])

    plt.show()

   

    cv2.waitKey(0)

    cv2.destroyAllWindows()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以下是对应的直方图正规化效果图和灰度直方图:

这边我特意挑选了一幅灰度值较窄的图像,从中可以直观的看出原图对应的灰度值主要集中在1~100之间,经过直方图正规化后,得到的右图的灰度直方图的灰度值主要集中在0~200之间,相较而言,灰度值范围有所增加,同时通过原图与直方图正规化图进行比较也可以得出,正规化后的图片的清晰度更好。


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