彩色图片的色值可分解为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()