OpenCV图像伽马变换

针对伽马变换,先检图像的灰度值归一化到[0,1]的区间上,对于8位图像的处理方式是直接除以255.0。伽马变换的实质是对图像矩阵中的每个值进行幂运算,可以使用Numpypower函数来实现矩阵的幂运算。

一般情况下如果图像整体较暗的情况下,其灰度直方图上的分布应该是不均匀的,大体应该高度集中在某一个区间或两个区间上(灰度直方图体现的是图像矩阵中每个像素点的灰度值),通过灰度直方图可以很好的区分图像的分布情况,下面通过python实例来了解OpenCV的图像伽马变换。

# -*- 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)

    #图像归一化

    f = I/255.0

    #伽马变换

    ga = 0.5

    O = np.power(f,ga)

    #显示原图和伽马变换后的效果图

    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)

    #将伽马变换后的图像去归一化,方便在灰度直方图上显示

    O = O*255.0

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

    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()

cv2.destroyAllWindows()

 

当伽马参数值ga等于0.5时,效果如下图所示:

当伽马参数值ga等于2时,效果如下图所示:

由图像可知,当图像整体偏暗的情况下,其灰度直方图中的灰度值分布较不均匀。可以通过改变灰度值的分布情况,来提高图像的清晰图,即对比值。


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