1. 程式人生 > >Python OpenCV _6直方圖均衡化(查詢表,OpenCV,Numpy等方法)

Python OpenCV _6直方圖均衡化(查詢表,OpenCV,Numpy等方法)

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

程式碼結果:

 

 

歡迎掃碼關注微信公眾號