简单的自动曝光/平均像素值
题目描述
一个图像有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()