直方图均衡化python代码实现

图像灰度变换中一个非常有用的例子就是直方图均衡化。直方图均衡化是指将一幅图像的灰度直方图变平,使变换后的图像中每个灰度值的分布概率都相同。在对图像做进一步处理之前,直方图均衡化通常是对图像灰度值进行归一化的一个非常好的方法,并且可以增强图像的对比度。

在这种情况下,直方图均衡化的变换函数是图像中像素值的累积分布函数(累积直方图)(cumulative distribution function,简写为cdf,将像素值的范围映射到目标范围的归一化操作)。

具体理论参考:

http://blog.csdn.net/qianqing13579/article/details/52422364

http://blog.csdn.net/superjunenaruto/article/details/52431941

直方图均衡化主要分为三个步骤:

第一步:统计直方图每个灰度级出现的次数

直方图均衡化python代码实现_第1张图片

第二步:累计归一化的直方图

直方图均衡化python代码实现_第2张图片

最后一步:计算新像素的的值

直方图均衡化python代码实现_第3张图片

结果:

原始图像:

直方图均衡化python代码实现_第4张图片

原始图像直方图:

直方图均衡化python代码实现_第5张图片

处理后的图像:

直方图均衡化python代码实现_第6张图片

处理后图像的直方图:

直方图均衡化python代码实现_第7张图片

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


你可能感兴趣的:(python,图像处理)