python做灰度变换,求解。


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):
    # 建立查找表,将像素值[0255]映射到调整后的伽玛值
    # 遍历[0255]范围内的所有像素值来构建查找表,然后再提高到反伽马的幂-然后将该值存储在表格中
    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)

可参考:
使用Python和OpenCV实现超快速,简单的伽玛校正功能_程序媛一枚~的博客-CSDN博客 这篇博客将介绍伽马校正(也称为幂律变换)是什么,并将使用Python和OpenCV实现伽玛校正。使用伽玛校正的原因是因为眼睛与数码相机中的传感器所感知的颜色和亮度不同。当数码相机上的传感器接收到两倍数量的光子时,信号将加倍。但是当光子增加一倍时,眼睛感知到的光量只是原来的一小部分。因此,尽管数字照相机在亮度之间具有线性关系,但眼睛却具有非线性关系。为了解决这种差异,将应用伽马校正。尝试对自己的照片进行伽玛校正。查找过暗或过亮并被冲洗掉的图像。然后对这些图像进行伽玛校正,看它们是否在视觉上更具吸引力。 https://blog.csdn.net/qq_40985985/article/details/113537447

如有帮助,请采纳哦~