自动色阶调整

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_36810544/article/details/84787704

上个版本有点小问题,只考虑了通道直方图的颜色范围分布,但是没有考虑分布的概率。如果,原图像某个通道的范围已经是[0,255]了,但是230-255之间的累积量特别少,这样还是要调整的。所谓修改了一下,彻底和PS的“自动色阶”效果一致了。图像整体偏色,读入后直接调用即可。

# 自动色阶亮度
def AutoBrightness(raw_img):
    rgb_min_output = 0
    rgb_max_output = 255
    channel_list = []

    # 计算各通道的直方图,确定输入的最大/小值
    channel_min_input = [np.min(raw_img[:,:,c]) for c in range(3)]
    channel_max_input = [np.max(raw_img[:,:,c]) for c in range(3)]   

    hist_list = []
    for i in range(3):
        hist_c, bin_edges = np.histogram(raw_img[:, :, i], bins=256, range=(0, 256), density=True)
        hist_list.append(hist_c)

    hist_array = np.array(hist_list)
    for c in range(3):
        sum = 0
        for index, element in enumerate(hist_array[c]):
            sum += element
            if sum > 0.99:
                channel_max_input[c] = index
                break

    # 计算各值的输出值
    for i in range(3):
        channel = [0] * (channel_max_input[i] + 1)        
        for x in range(channel_min_input[i], channel_max_input[i] + 1):
            output = rgb_min_output + \
                     (x - channel_min_input[i]) / \
                     (channel_max_input[i] - channel_min_input[i]) * \
                     (rgb_max_output - rgb_min_output) + 0.5
            channel[x] = output
        channel_list.append(channel)

    # 图像色阶调整
    dst = raw_img.copy()
    for w in range(raw_img.shape[0]):
        for h in range(raw_img.shape[1]):
            for c in range(3):
                try:
                    dst[w, h, c] = channel_list[c][raw_img[w, h, c]]
                except Exception as ex:
                    if raw_img[w, h, c] > channel_max_input[c]:
                        dst[w, h, c] = 255    
    return dst

========================= 之前有问题版本======================
图像处理后发现整体偏暗,查看后发现色阶范围是0-100,需要自动调节一下,调整到0-255
代码很简单:

# 自动色阶亮度
def AutoBrightness(raw_img):
    rgb_min_output = 0
    rgb_max_output = 255
    channel_list = []

    for i in range(3):
        channel_min_input = np.min(raw_img[:,:,i])
        channel_max_input = np.max(raw_img[:,:,i])
        channel = [0] * (channel_max_input - channel_min_input + 1)
        for x in range(channel_min_input, channel_max_input + 1):
            output = rgb_min_output + \
                     (x - channel_min_input) / \
                     (channel_max_input - channel_min_input) * \
                     (rgb_max_output - rgb_min_output) + 0.5
            channel[x] = output
        channel_list.append(channel)

    dst = raw_img.copy()

    for w in range(raw_img.shape[0]):
        for h in range(raw_img.shape[1]):
            for c in range(3):
                dst[w,h,c] = channel_list[c][raw_img[w,h,c]]
    return dst

原图:
在这里插入图片描述
调整后:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36810544/article/details/84787704