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()
代码结果:
欢迎扫码关注微信公众号