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

代码结果:

 

欢迎扫码关注微信公众号 

猜你喜欢

转载自blog.csdn.net/sxlsxl119/article/details/84323973