华为od机考题25:简单自动曝光平均像素值,Python

题目描述

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

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

请输出这个整数k。

输入描述

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

eg.

129 130 129 130

备注

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

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

输出描述

一个整数k

-2

import sys
input_str = sys.stdin.readline().strip()
img = list(map(int, input_str.split()))
len = len(img)
min_diff = sys.maxsize
#这行代码的作用是将变量 min_diff 初始化为一个非常大的值,通常在寻找最小值的算法中会这样做,目的是为了后续通过比较,用实际找到的较小值去更新它。
k_ans = 0
print(min_diff)

for k in range(-127, 129):#考虑到像素值取值范围为[0, 255],故k值取值范围在[-127, 129)之中
    sum = 0
    for i in range(len):
        new_val = img[i] + k
        new_val = max(0, min(new_val, 255))#新图的像素值会自动截取到[0,255]范围。当新像素值<0,其值会更改为0;当新像素值>255,其值会更改为255
        sum += new_val
    diff = abs(sum / len - 128)
    if diff < min_diff:
        min_diff = diff
        k_ans = k
    elif diff == min_diff and k_ans != 0:
        k_ans = min(k_ans, k)

print(k_ans)
  1. import sys

    • 这行代码导入了 Python 的 sys 模块。sys 模块提供了一些与 Python 解释器和它的环境相关的函数和变量,在这里我们使用它来从标准输入读取数据。
  2. input_str = sys.stdin.readline().strip()

    • sys.stdin.readline() 从标准输入读取一行数据,返回的是一个字符串,这个字符串包含了用户输入的内容以及换行符(如果有的话)。
    • strip() 方法用于移除字符串开头和结尾的空白字符(包括空格、制表符、换行符等)。所以 input_str 最终是一个去除了首尾空白字符的字符串。

解题思路

代码思路

本题的解题思路是通过枚举每一个可能的 k值,计算新图像的每个像素点的值,并找出使得新图像的平均值与中位值 128 的差的绝对值最小的 k 值。

具体实现步骤如下:

  1. 枚举每一个可能的 k kk 值

    • 计算新图像的每个像素点的值。
    • 将这些像素点的值累加起来,得到新图像的所有像素点值的和 sum
  2. 计算平均值和差的绝对值

    • 计算新图像的平均值 sum / len
    • 计算新图像的平均值与中位值 128 之间的差的绝对值 diff
  3. 更新最优解

    • 如果 diff 小于 min_diff,更新 min_diff 为当前的 diff,并更新 k_ans 为当前的 k 值。
    • 如果 diff 等于 min_diff 且 k_ans 不等于 0,则更新 k_ans 为 k 和 k_ans 中的较小值。
注意事项

对于每一个像素点的新值,需要确保其在 [0, 255] 的范围内:

  • 如果新值小于 0,则将其设为 0。
  • 如果新值大于 255,则将其设为 255。
  • 如果有多个整数 k 满足条件,输出较小的那个 k。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值