python opencv 图像增强算法
import cv2
import numpy as np
import math
def LinearTransform(img):#线性变换
out = 2.0 * img
# 进行数据截断,大于255的值截断为255
out[out > 255] = 255
# 数据类型转换
out = np.around(out)
out = out.astype(np.uint8)
return out
def HistNormalization(img):#直方图正规化
Imin, Imax = cv2.minMaxLoc(img)[:2]
Omin, Omax = 0, 255
# 计算a和b的值a
a = float(Omax - Omin) / (Imax - Imin)
b = Omin - a * Imin
out = a * img + b
out = out.astype(np.uint8)
return out
def gamaTransform(img):#伽马变换
fi = img / 255.0
gamma = 0.4
out = np.power(fi, gamma)
return out
def HistEqualization(img):#直方图均匀化
h, w = img.shape[:2]
# 第一步:计算灰度直方图
grayHist, bins = np.histogram(img, 256, [0, 255])
# grayHist = np.zeros([256], np.uint64)
# for i in range(h):
# for j in range(w):
# grayHist[img[i][j]] += 1
# 第二步:计算累加灰度直方图
zeroCumuMoment = np.zeros([256], np.uint32)
for p in range(256):
if p == 0:
zeroCumuMoment[p] = grayHist[0]
else:
zeroCumuMoment[p] = zeroCumuMoment[p - 1] + grayHist[p]
# 第三步:根据累加灰度直方图得到输入灰度级和输出灰度级之间的映射关系
outPut_q = np.zeros([256], np.uint8)
cofficient = 256.0 / (h * w)
for p in range(256):
q = cofficient * float(zeroCumuMoment[p]) - 1
if q >= 0:
outPut_q[p] = math.floor(q)
else:
outPut_q[p] = 0
# 第四步:得到直方图均衡化后的图像
equalHistImage = np.zeros(img.shape, np.uint8)
for i in range(h):
for j in range(w):
equalHistImage[i][j] = outPut_q[img[i][j]]
outPut_q[p] = 0
return equalHistImage