Python OpenCV _6直方圖均衡化(查詢表,OpenCV,Numpy等方法)
阿新 • • 發佈:2018-11-23
Python OpenCV這個初級影象處理系列是參考他人的文章寫的,有些地方做了一些改動,沒有太多理論,側重程式碼實現,主要目的是將這些基本操作程式碼系統地梳理一遍,也是為了以後能快速查詢。
此係列原始碼在我的GitHub裡:https://github.com/yeyujujishou19/Python-OpenCV
處理原圖
一,使用查詢表來拉伸直方圖
# coding=utf-8 import cv2 import numpy as np image = cv2.imread("D:/test/2.jpg", 0) lut = np.zeros(256, dtype=image.dtype) # 建立空的查詢表 hist = cv2.calcHist([image], # 計算影象的直方圖 [0], # 使用的通道 None, # 沒有使用mask [256], # it is a 1D histogram [0.0, 255.0]) minBinNo, maxBinNo = 0, 255 # 計算從左起第一個不為0的直方圖柱的位置 for binNo, binValue in enumerate(hist): if binValue != 0: minBinNo = binNo break # 計算從右起第一個不為0的直方圖柱的位置 for binNo, binValue in enumerate(reversed(hist)): if binValue != 0: maxBinNo = 255 - binNo break print(minBinNo, maxBinNo) # 生成查詢表 for i, v in enumerate(lut): print i if i < minBinNo: lut[i] = 0 elif i > maxBinNo: lut[i] = 255 else: lut[i] = int(255.0 * (i - minBinNo) / (maxBinNo - minBinNo) + 0.5) # 計算 result = cv2.LUT(image, lut) cv2.imshow("Orign", image) cv2.imshow("Result", result) cv2.imwrite("LutImage.jpg", result) cv2.waitKey(0) cv2.destroyAllWindows()
程式碼結果:
二,直方圖均衡化(OpenCV實現)
# coding=utf-8
import cv2
img = cv2.imread("D:/test/2.jpg",0)
equ = cv2.equalizeHist(img)
cv2.imshow('equ',equ)
cv2.waitKey(0)
cv2.destroyAllWindows()
程式碼結果:
二,直方圖均衡化(NumPy函式實現)
# coding=utf-8 import cv2 import numpy as np image = cv2.imread("D:/test/2.jpg", 0) lut = np.zeros(256, dtype=image.dtype) # 建立空的查詢表 hist, bins = np.histogram(image.flatten(), 256, [0, 256]) cdf = hist.cumsum() # 計算累積直方圖 cdf_m = np.ma.masked_equal(cdf, 0) # 除去直方圖中的0值 cdf_m = (cdf_m - cdf_m.min()) * 255 / (cdf_m.max() - cdf_m.min()) # 等同於前面介紹的lut[i] = int(255.0 *p[i])公式 cdf = np.ma.filled(cdf_m, 0).astype('uint8') # 將掩模處理掉的元素補為0 # 計算 result2 = cdf[image] result = cv2.LUT(image, cdf) cv2.imshow("OpenCVLUT", result) cv2.imshow("NumPyLUT", result2) cv2.waitKey(0) cv2.destroyAllWindows()
程式碼結果:
歡迎掃碼關注微信公眾號