图像灰度变换中一个非常有用的例子就是直方图均衡化。直方图均衡化是指将一幅图像的灰度直方图变平,使变换后的图像中每个灰度值的分布概率都相同。在对图像做进一步处理之前,直方图均衡化通常是对图像灰度值进行归一化的一个非常好的方法,并且可以增强图像的对比度。
在这种情况下,直方图均衡化的变换函数是图像中像素值的累积分布函数(累积直方图)(cumulative distribution function,简写为cdf,将像素值的范围映射到目标范围的归一化操作)。
具体理论参考:
http://blog.csdn.net/qianqing13579/article/details/52422364
http://blog.csdn.net/superjunenaruto/article/details/52431941
直方图均衡化主要分为三个步骤:
原始图像:
原始图像直方图:
处理后的图像:
处理后图像的直方图:
python代码:
#coding:utf-8
import cv2 as cv
import numpy as np
img = cv.imread('source.jpg')
im_gray = cv.cvtColor(img,cv.COLOR_RGB2GRAY)#将图像转为灰度,减少计算的维度
cv.imshow('im_gray',im_gray)
w = im_gray.shape[0]
h = im_gray.shape[1]
print im_gray
import matplotlib.pyplot as plt
p1 = plt.hist(im_gray.reshape(im_gray.size,1))
#plt.subplot(121)
plt.show()
#创建直方图
n = np.zeros((256),dtype = np.float)
p = np.zeros((256),dtype = np.float)
c = np.zeros((256),dtype = np.float)
#遍历图像的每个像素,得到统计分布直方图
for x in range(0,im_gray.shape[0]):
for y in range(0,im_gray.shape[1]):
#print im_gray[x][y]
n[im_gray[x][y]] += 1
print n
#归一化
for i in range(0,256):
p[i] = n[i]/float(im_gray.size)
#计算累积直方图
c[0] = p[0]
for i in range(1,256):
c[i] = c[i-1]+p[i]
print c
des = np.zeros((w,h),dtype=np.uint8)
for x in range(0,w):
for y in range(0,h):
des[x][y] = 255*c[im_gray[x][y]]
print des
cv.imshow('des',des)
p2 = plt.hist(des.reshape(des.size,1))
#plt.subplot(121)
plt.show()