自动色阶校正之提高效率

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

上一篇写的没有任何问题,功能完全Ok,但是一旦需要校正的图片分辨率比较大,比如2320*3088会明显的感到很慢,虽然文件本身不大才600多k,但是分辨率高啊,之前的方法是三个循环去给像素挨个赋值,这绝对是假python代码好不好,哈哈!测试了一下需要7s多,这个结果也只有学校实验室里能接受吧。把三个过程需要时间分别打印出来后发现调整像素最耗时,所以果断改进这里。
没优化前用时:
在这里插入图片描述
优化后用时:
在这里插入图片描述
总共提高了11.32/0.21 = 53.9倍,这速度 不用我过多描述了
主要修改了像素赋值的操作,从三个for循环变成了numpy的计算

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

    # 计算各通道的直方图,确定输入的最大/小值
    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)
    start = time.time()
    # 计算各通道的最大/最小值
    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

        sum = 0
        for i in range(len(hist_array[c]) - 1, -1, -1):
            sum += hist_array[c][i]
            if sum > 0.99:
                channel_min_input[c] = i
                break
    end = time.time()
    print('计算通道值, 用时:' + str(end - start))


    try:
        start = time.time()
        # 计算各值的输出值
        for i in range(3):
            channel = [0] * (channel_max_input[i] + 1)
            # channel = [0] * (channel_max_input[i] - channel_min_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(np.array(channel))
        end = time.time()
        print('计算输出值, 用时:' + str(end - start))

        start = time.time()
        # 图像色阶调整
        dst = raw_img.copy()
        for c in range(3):
            dst[raw_img[:,:,c] > channel_max_input[c]] = 255
            dst[:,:,c] = channel_list[c][dst[:,:,c]]
        end = time.time()
        print('调整, 用时:' + str(end - start))
    except Exception as e:
        dst = raw_img.copy()
    return dst

猜你喜欢

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