機器學習進階-直方圖與傅里葉變化-直方圖均衡化 1.cv2.equalizeHist(進行直方圖均衡化) 2. cv2.createCLAHA(用於生成自適應均衡化圖像)


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()

可以看出自適應均衡化沒有使得人物臉部的細節消失

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM