彩色图片的色值可分解为B、G、R三原色,于是,我们利用openCV自带的calcHist函数可以计算其直方图。
实现代码如下:
import cv2
import numpy as np
def ImageHist(image, type):
color = (255,255,255)
windowName = 'Gray'
if type == 31:
color = (255,0,0)
windowName = 'B Hist'
elif type == 32:
color = (0,255,0)
windowName = 'G Hist'
elif type == 33:
color = (0,0,255)
windowName = 'R Hist'
# 调用opencv中的 calcHist 函数。
# 参数1为图片数据;参数2为通道,因为使用第一个通道,因而是0;参数3为蒙版,用不到None;
# 参数4表示直方图size 有多少柱状,这里有256个;参数5表示像素范围为0-255
hist = cv2.calcHist([image],[0],None,[256],[0.0,255.0])
minV, maxV, minL, maxL = cv2.minMaxLoc(hist) # 获取hist中的最大值与最小值及其分别对应的坐标
histImg = np.zeros((256,256,3),np.uint8) # 创建画布
# 使用循环绘制直方图
for i in range(256):
intenNormal = int(hist[i]*256/maxV) # 将直方图数据归一化,回归一到0-256之间
cv2.line(histImg,(i,256),(i,256-intenNormal),color)
cv2.imshow(windowName,histImg)
return histImg
img = cv2.imread('OpenCV\\image0.JPG',1)
channels = cv2.split(img) # 将色彩值分解为 B G R
for i in range(3):
ImageHist(channels[i],31+i)
cv2.waitKey(0)
cv2.destroyAllWindows()
实现结果如下:
在openCV中也有将直方图均衡化的函数equalizeHist()。废话不多说,代码示例如下:
1、灰度直方图均衡化:
import cv2
import numpy as np
# 灰度直方图均衡化
img = cv2.imread('OpenCV\\image0.JPG',1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = cv2.equalizeHist(gray)
cv2.imshow('src', gray)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、彩色直方图均衡化
import cv2
import numpy as np
img = cv2.imread('OpenCV\\image0.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]) # 通道合成
cv2.imshow('src', img)
cv2.imshow('dst', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
3、YUV直方图均衡化
import cv2
import numpy as np
img = cv2.imread('OpenCV\\image0.JPG',1)
# YUV 直方图均衡化
imgYUV = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
channelYUV = cv2.split(imgYUV)
channelYUV[0] = cv2.equalizeHist(channelYUV[0]) # 选取第一维通道
channels = cv2.merge(channelYUV)
result01 = cv2.cvtColor(channels, cv2.COLOR_YCrCb2BGR)
cv2.imshow('src', img)
cv2.imshow('dst', result01)
cv2.waitKey(0)
cv2.destroyAllWindows()