1. cv2.equalizeHist(img) # 表示進行直方圖均衡化
參數說明:img表示輸入的圖片
2.cv2.createCLAHA(clipLimit=8.0, titleGridSize=(8, 8)) 用於生成自適應均衡化圖像
參數說明:clipLimit顏色對比度的閾值, titleGridSize進行像素均衡化的網格大小,即在多少網格下進行直方圖的均衡化操作
直方圖均衡化:一般可以用來提升圖片的亮度, 在上面一節中,我們可以看出在150-200之間所占的頻數特別的大,頻數均衡化指的是讓頻數的分布看起來更加均勻一些
主要實現的手段
上圖中的左邊的圖是原始數據, 右邊的圖是進行函數映射后的灰度值
首先對各個灰度值做頻數統計,計算其概率,根據像素的灰度值計算出累積概率,最后將累積概率 * (255-0) 做為函數映射后的灰度值,
這樣做的目的,可以使得灰度值之間的間隔更小,即一些頻數較大的灰度值補充給了頻數較小的灰度值,從而實現了灰度值的均衡化
代碼:
第一步:讀入圖片
第二步:使用cv2.equalizeHist(img)均衡化像素
第三步:使用plt.hist 畫出均衡化的直方圖
第四步:使用plt.imshow 畫出均衡化后的圖像
import cv2 import numpy as np import matplotlib.pyplot as plt # 第一步:讀入圖片 img = cv2.imread('cat.jpg', 0) # 第二步: 使用cv2.equalizeHist實現像素點的均衡化 ret = cv2.equalizeHist(img) # 第三步:使用plt.hist繪制像素直方圖 plt.subplot(121) plt.hist(img.ravel(), 256) plt.subplot(122) plt.hist(ret.ravel(), 256) plt.show() # 第四步:使用cv2.imshow()繪值均衡化的圖像 cv2.imshow('ret', np.hstack((img, ret))) cv2.waitKey(0)
這種全局的均衡化也會存在一些問題,由於整體亮度的提升,也會使得局部圖像的細節變得模糊,因為我們需要進行分塊的局部均衡化操作
代碼:
第一步:使用cv2.createCLAHE(clipLimit=2.0, titleGridSize=(8, 8)) 實例化均衡直方圖函數
第二步:使用.apply進行均衡化操作
第三步:進行畫圖操作
# 使用自適應直方圖均衡化 # 第一步:實例化自適應直方圖均衡化函數 clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) # 第二步:進行自適應直方圖均衡化 clahe = clahe.apply(img) # 第三步:進行圖像的展示 cv2.imshow('imgs', np.hstack((img, ret, clahe))) cv2.waitKey(0) cv2.destroyAllWindows()
可以看出自適應均衡化沒有使得人物臉部的細節消失