OpenCV - 直方图均衡化(Python实现)

原理

直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。
直方图均衡化
OpenCV - 直方图均衡化(Python实现)_第1张图片

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image.jpg',0)
#flatten() 将数组变成一维
hist,bins = np.histogram(img.flatten(),256,[0,256])
# 计算累积分布图
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max()/ cdf.max()
plt.plot(cdf_normalized, color = 'b')
plt.hist(img.flatten(),256,[0,256], color = 'r')
plt.xlim([0,256])
plt.legend(('cdf','histogram'), loc = 'upper left')
plt.show()

OpenCV - 直方图均衡化(Python实现)_第2张图片
接下来我们对上面的直方图进行均衡化

直方图均衡化

OpenCV 中的直方图均衡化函数为 cv2.equalizeHist()。这个函数的输入图片仅仅是一副灰度图像,输出结果是直方图均衡化之后的图像。

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image.jpg',0)

equ = cv2.equalizeHist(img)
res = np.hstack((img,equ))
#stacking images side-by-side
cv2.imshow('img',res)
cv2.waitKey()
cv2.destroyAllWindows()

OpenCV - 直方图均衡化(Python实现)_第3张图片

CLAHE 有限对比适应性直方图均衡化

这种情况下,整幅图像会被分成很多小块,这些小块被称为“tiles”(在 OpenCV 中 tiles 的大小默认是 8x8),然后再对每一个小块分别进行直方图均衡化(跟前面类似)。

import numpy as np
import cv2
img = cv2.imread('image.jpg',0)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
cv2.imwrite('clahe_2.jpg',cl1)

OpenCV - 直方图均衡化(Python实现)_第4张图片

彩色直方图均衡化

#彩色图像均衡化
import cv2
import numpy as np
img = cv2.imread('img.jpg',1)
(b,g,r) = cv2.split(img) #通道分解
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
result = cv2.merge((bH,gH,rH),)#通道合成
res = np.hstack((img,result))
cv2.imshow('dst',res)
cv2.waitKey(0)

你可能感兴趣的:(【OpenCV】)