简单的自动曝光/平均像素值

题目描述

一个图像有n个像素点, 存储在一个长度为n的数组img里, 每个像素点的取值范围 [0,255] 的正整数.

请你给图像每个像素点值加上一个整数k (可以是负数), 得到新图newImg, 使得新图newImg的所有像素平均值最接近中位值128.

请输出这个整数k.

输入描述

n个整数, 中间用空格分开.

备注:

  • 1 <= n <= 100
  • 如有多个整数k都满足, 输出小的那个k
  • 新图的像素值会自动截取到 [0,255] 范围
  • 当新像素值 < 0, 其值会更改为0; 当新像素值 > 255, 其值会更改为255

例如newImg=-1 -2 256, 会自动更改为 0 0 255

输出描述

一个整数k.

示例1

输入:

129 130 129 130

输出:

-2

说明: -1的均值128.5, -2的均值为127.5, 输出较小的数-2.

示例2

输入:

0 0 0 0

输出:

128

说明: 四个像素值都为0.

题解

Python

def main():
    # 读取输入
    img = list(map(int, input().split()))
    num_pixels = len(img)
    assert 1 <= num_pixels <= 100

    # 平均值与 128 之间的差距
    min_diff = 255
    # 与平均值与 128 之间的差距最小时的 k 值
    best_k = 0

    # 然后遍历所有可能的k值, 计算经它调整之后所有像素的平均值
    for k in range(-127, 128):
        # 计算当前的平均值
        sum_pixels = 0
        for pixel in img:
            # 遍历每个像素点, 计算新的像素值
            # 注意像素值的范围是 [0, 255]
            new_pixel = pixel + k
            new_pixel = min(new_pixel, 255)
            new_pixel = max(new_pixel, 0)
            sum_pixels += new_pixel
        avg_pixel = sum_pixels / num_pixels
        pixel_diff = abs(avg_pixel - 128)
        if pixel_diff < min_diff:
            min_diff = pixel_diff
            best_k = k
        elif pixel_diff == min_diff and best_k != 0:
            # 如果平均值相等, 那就选择较小的那个
            best_k = min(best_k, k)

    # 打印结果
    print(best_k)


if __name__ == "__main__":
    main()