import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import math
def gama_image(c, gama, image): # 幂律变换的三个变量
# 原图像的大小
h, w, d = image.shape
# 创建与原图像大小一样的模板
new_image = np.zeros((h, w, d), dtype=np.float32)
for i in range(h):
for j in range(w):
# 各通道像素值计算
new_image[i, j, 0] = c * math.pow(image[i, j, 0], gama)
new_image[i, j, 1] = c * math.pow(image[i, j, 1], gama)
new_image[i, j, 2] = c * math.pow(image[i, j, 2], gama)
# 归一化处理,目标图像灰度范围(0, 255 )
cv.normalize(new_image, new_image, 0, 255, cv.NORM_MINMAX)
# 数据类型变8bit
new_image = cv.convertScaleAbs(new_image)
return new_image
img = cv.imread('D:\\Test Picture\\OIP-C (1).jfif')
new_img = gama_image(1, 0.4, img)
cv.imshow('gama', new_img)
cv.waitKey(0)
cv.destroyAllWindows()
运行程序没有弹出错误提示,但是程序却一直处于运行状态,没有输出结果。
是哪个部分出了问题?
这种计算太慢了,尤其当图特别大的时候,推荐另一种速度较快的幂律变换,也称伽马校正。
import cv2 as cv
import numpy as np
# 伽马校正
# --image 要对其应用伽玛校正的图像。
# --gamma (可选)伽玛值,默认1.0
def adjust_gamma(image, gamma=1.0):
# 建立查找表,将像素值[0,255]映射到调整后的伽玛值
# 遍历[0,255]范围内的所有像素值来构建查找表,然后再提高到反伽马的幂-然后将该值存储在表格中
invGamma = 1.0 / gamma
table = np.array([((i / 255.0) ** invGamma) * 255
for i in np.arange(0, 256)]).astype("uint8")
# 使用查找表应用伽玛校正
return cv.LUT(image, table)
img = cv.imread('images/ask.png')
gamma = adjust_gamma(img, gamma=0.4)
cv.imshow('gama', gamma)
cv.waitKey(0)
如有帮助,请采纳哦~