1. 直方图获取与显示
相关函数:
- cv2.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])
详细信息请参考 [OpenCV-Python] OpenCV 中的图像处理 部分 IV (五) - np.histogram()
详细信息请参考Matplotlib绘图优化-使用np.histogram绘制直方图(柱状图)
import cv2
import numpy as np
img_file = './monarch.png'
# Read in grayscale
img_gray = cv2.imread(img_file, cv2.IMREAD_GRAYSCALE)
hist_original = cv2.calcHist(images=[img_gray], channels=[0], mask=None, histSize=[256], ranges=[0,256])
2. 画柱状图
import cv2
import numpy as np
import matplotlib.pyplot as plt
img_file = './monarch.png'
img_gray = cv2.imread(img_file, cv2.IMREAD_GRAYSCALE)
plt.figure(figsize=(4,3))
x_index = list(np.arange(0, 256))
histr = cv2.calcHist(images=[img_gray], channels=[0], mask=None, histSize=[256], ranges=[0,256])
histr = list(histr.astype(np.uint8).reshape((1,256))[0])
plt.bar(x_index, histr, 1, color='g')
plt.show()
image.png
3. RGB三通道
import cv2
import numpy as np
import matplotlib.pyplot as plt
img_file = './monarch.png'
# Read in BGR
img_bgr = cv2.imread(img_file, cv2.IMREAD_COLOR)
x_index = list(np.arange(0, 256))
print(x_index)
color = ('blue','green','red')
plt.figure(figsize=(4,3))
for i,c in enumerate(color):
histr = cv2.calcHist(images=[img_bgr], channels=[i], mask=None, histSize=[256], ranges=[0,256])
histr = list(histr.astype(np.uint32).reshape((1,256))[0])
plt.bar(x_index, histr, 1, color=c)
plt.legend(('B', 'G', 'R'), loc = 'upper right')
plt.show()
image.png
4. 直方图均衡化
import cv2
import numpy as np
import matplotlib.pyplot as plt
img_file = './monarch.png'
# Read in grayscale
img_gray = cv2.imread(img_file, cv2.IMREAD_GRAYSCALE)
hist_original = cv2.calcHist(images=[img_gray], channels=[0], mask=None, histSize=[256], ranges=[0,256])
hist_original = list(hist_original.astype(np.uint32).reshape((1,256))[0])
img_gray_eq = cv2.equalizeHist(img_gray)
hist_eq = cv2.calcHist(images=[img_gray_eq], channels=[0], mask=None, histSize=[256], ranges=[0,256])
hist_eq = list(hist_eq.astype(np.uint32).reshape((1,256))[0])
img_gray_mapped = (img_gray.astype(np.float32)*0.6).astype(np.uint8)
hist_mapped = cv2.calcHist(images=[img_gray_mapped], channels=[0], mask=None, histSize=[256], ranges=[0,256])
hist_mapped = list(hist_mapped.astype(np.uint32).reshape((1,256))[0])
img_gray_map_eq = cv2.equalizeHist(img_gray_mapped)
hist_map_eq = cv2.calcHist(images=[img_gray_map_eq], channels=[0], mask=None, histSize=[256], ranges=[0,256])
hist_map_eq = list(hist_map_eq.astype(np.uint32).reshape((1,256))[0])
# Draw the hsitogram using plt
x_index = np.arange(0, 256)
plt.figure(figsize=(6,3))
plt.subplot(241), plt.imshow(img_gray, cmap='gray'), plt.title('img original')
plt.subplot(245), plt.bar(x_index, hist_original), plt.title('hist original')
plt.subplot(242), plt.imshow(img_gray_eq, cmap='gray'), plt.title('img equalized')
plt.subplot(246), plt.bar(x_index, hist_eq), plt.title('hist equalized')
plt.subplot(243), plt.imshow(img_gray_mapped, cmap='gray'), plt.title('img mapped')
plt.subplot(247), plt.bar(x_index, hist_mapped), plt.title('hist mapped')
plt.subplot(244), plt.imshow(img_gray_map_eq, cmap='gray'), plt.title('img map equalized')
plt.subplot(248), plt.bar(x_index, hist_map_eq), plt.title('hist map equalized')
plt.show()
image.png