1.基于直方圖的影像增強原理

1.1直方圖是什么?
直方圖分為一維直方圖和二維直方圖,文本僅介紹一維直方圖,讀者可舉一反三學會二維直方圖,
如上就是一張圖片的一維直方圖,一維直方圖描述的是圖片的灰度圖形式中灰度級與數量的關系,x軸表示灰度級,y軸表示該灰度級的像素點數量,以下都將一維直方圖簡稱為直方圖,
1.2直方圖與影像增強
影像的明暗狀況與對比度等特征資訊都可以通過直方圖反應出來,因此可以通過修改直方圖的方法來調整一幅數字影像的灰度分布以達到增強影像的目的,常用的方法有直方圖均衡化與直方圖規定化,
1.3獲取直方圖,基于opencv
hist=cv.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
引數決議:
hist:輸出直方圖,舉個例子,對于灰度圖來說,有256個不同的像素值,因此hist是一個256行,1列的矩陣,每行中的數值表示影像中對應這個像素值的像素點數量,
images:源影像,應該是把影像放在[]中如:[img]
channels:用于計算直方圖的dims通道串列,也以方括號給出,它是我們計算直方圖的通道的索引,例如,如果輸入為灰度影像,則其值為[0],對于彩色影像,您可以傳遞[0],[1]或[2]分別計算藍色,綠色或紅色通道的直方圖,
mask:老生常談,掩膜,需要需找影像特定區域的直方圖時才建,
histSize:BIN計數,需要放在[]中,對于全尺寸為[256],
ranges:通常為[0,256],
accumulate:累加標志,如果設定了,則在分配直方圖時,直方圖在開始時不會被清除,此功能使您能夠從多組陣列中計算單個直方圖,或者及時更新直方圖,
# 使用范例
import cv2 as cv
img = cv.imread('cr7.jpg',0)
hist = cv.calcHist([img],[0],None,[256],[0,256])
1.4繪制直方圖,基于opencv
import cv2 as cv
from matplotlib import pyplot as plt
# 讀灰度圖
img = cv.imread('cr7.jpg',0)
# 取直方圖
hist = cv.calcHist([img],[0],None,[256],[0,256])
# 展示灰度圖和直方圖
plt.subplot(121), plt.imshow(img, 'gray')
plt.subplot(122), plt.plot(hist),plt.xlim([0,256])
plt.show()
2.直方圖均衡化
2.1均衡化原理




2.2均衡化程式實作,基于opencv
均衡化函式:dst=cv.equalizeHist(src[, dst])
灰度圖均衡化:
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('cr7.jpg',0)
img_hist = cv.calcHist([img],[0],None,[256],[0,256])
equ = cv.equalizeHist(img)
equ_hist = cv.calcHist([equ],[0],None,[256],[0,256])
plt.subplot(211), plt.plot(img_hist),plt.xlim([0,255])
plt.subplot(212), plt.plot(equ_hist),plt.xlim([0,255])
plt.show()

彩色圖片均衡化:
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread("cr7.jpg")
# 拆分通道
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]
# 得到原來3通道的直方圖
b_hist = cv.calcHist([b],[0],None,[256],[0,256])
g_hist = cv.calcHist([g],[0],None,[256],[0,256])
r_hist = cv.calcHist([r],[0],None,[256],[0,256])
# 直方圖均衡化
b2 = cv.equalizeHist(b)
g2 = cv.equalizeHist(g)
r2 = cv.equalizeHist(r)
# 查看均衡化后3通道的直方圖
b2_hist = cv.calcHist([b2],[0],None,[256],[0,256])
g2_hist = cv.calcHist([g2],[0],None,[256],[0,256])
r2_hist = cv.calcHist([r2],[0],None,[256],[0,256])
img2 = img.copy()
img2[:,:,0] = b2
img2[:,:,1] = g2
img2[:,:,2] = r2
plt.subplot(211), plt.plot(b_hist), plt.plot(g_hist), plt.plot(r_hist), plt.xlim([0,255])
plt.subplot(212), plt.plot(b2_hist), plt.plot(g2_hist), plt.plot(r2_hist), plt.xlim([0,255])
cv.imshow('before',img)
cv.imshow('after',img2)
plt.show()
cv.waitKey(0)

3.直方圖規定化
3.1規定化原理
直方圖均衡化能自動增強影像的整體對比度,但是往往結果難以受到控制,
實際中常常需要增強某個特定灰度值范圍內的對比度或使影像灰度值的分布滿足特定需求,這個時候使用直方圖規定化會有較好的結果,
離散狀態下的規定化步驟:

3.2規定化程式實作,基于opencv
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('cr7.jpg')
ref = cv2.imread('azr.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ref_gray = cv2.cvtColor(ref, cv2.COLOR_BGR2GRAY)
hist = cv2.calcHist([gray], [0], None, [256], [0, 256])
hist_ref = cv2.calcHist([ref_gray], [0], None, [256], [0, 256])
# 計算累計直方圖
out = np.zeros_like(img)
tmp_ref = 0.0
h_ref = hist_ref.copy()
for i in range(256):
tmp_ref += h_ref[i]
h_ref[i] = tmp_ref
tmp = 0.0
h_acc = hist.copy()
for i in range(256):
tmp += hist[i]
h_acc[i] = tmp
# 計算映射
diff = np.zeros([256, 256])
for i in range(256):
for j in range(256):
diff[i][j] = np.fabs(h_ref[j] - h_acc[i])
M = np.zeros(256)
for i in range(256):
index = 0
min = diff[i][0] # min = 1.
for j in range(256):
if (diff[i][j] < min):
min = diff[i][j]
index = int(j)
M[i] = index
out = M[gray].astype(np.float32)
hist_img = cv2.calcHist([img], [0], None, [255], [0, 255])
hist_ref = cv2.calcHist([ref], [0], None, [255], [0, 255])
hist_out = cv2.calcHist([out], [0], None, [255], [0, 255])
plt.subplot(231)
plt.title("img")
plt.imshow(img)
plt.subplot(234)
plt.plot(hist_img)
plt.subplot(232)
plt.title("ref")
plt.imshow(ref)
plt.subplot(235)
plt.plot(hist_ref)
plt.subplot(233)
plt.title("out")
plt.imshow(out)
plt.subplot(236)
plt.plot(hist_out)
plt.show()

參考:
opencv檔案:https://docs.opencv.org/4.5.0/d6/dc7/group__imgproc__hist.html#ga4b2b5fd75503ff9e6844cc4dcdaed35d
一篇挺不錯的直方圖均衡化CSDN文章:
https://blog.csdn.net/v_xchen_v/article/details/79913245
Python OpenCV 直方圖匹配:
https://zhuanlan.zhihu.com/p/323220279
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290979.html
標籤:其他
上一篇:opencv攝像頭例外處理
