任务描述
背景
亮度调整是数字图像处理基本操作之一,如下图所示。
题外话:该图是图像处理领域知名度最高的图像之一,被广泛用于图像处理技术效果的测试,图中人物叫 Lena。
根据 RGB 颜色的原理可知,要调整一个颜色的亮度,可以将红、绿、蓝三个颜色分量都加上相同的调整量 n,n 是 [−255,255] 之间的整数,例如,当 n 为 50 时,RGB颜色 (148,65,93) 变为 (198,115,143),效果见下图。
任务
本关任务是实现函数enhancePixel(r, g, b, n),其功能是利用上述方法调整一个 RGB 颜色的亮度。说明如下:
1)参数r、g、b均为整数,分别表示一个 RGB 颜色的红、绿、蓝分量,参数n也为整数,表示亮度的调整量,r、g、b的值一定属于 [0,255],n的值一定属于 [−255,255];
2)返回值er、eg、eb均为整数,表示按上述方法调整亮度后的 RGB 颜色,例如,参数r、g、b、n分别为148、65、93、50时,则er、eg、eb分别为198、115、143;
3)需注意的是,调整后的颜色分量取值可能小于 0 或大于 255,若小于 0,则取 0,若大于 255,则取 255,例如,当 n 为 −100 时,RGB 颜色 (148,65,93) 调整后为 (48,0,0);
此外,初始代码中的enhanceImg函数会利用此函数调整一幅图像中所有像素的亮度,请看懂代码,后续关卡会用到类似的程序结构。
相关知识
略。
编程要求
在 Begin-End 区间实现enhancePixel(r, g, b, n)函数,具体要求见上。
测试说明
测试集正确结果如下:
(148, 65 , 93 ) -> 50 -> (198, 115, 143)
(1 , 10 , 100) -> 99 -> (100, 109, 199)
(200, 200, 200) -> 200 -> (255, 255, 255)
(10 , 10 , 10 ) -> -20 -> (0 , 0 , 0 )
(100, 200, 255) -> -200 -> (0 , 0 , 55 )
你的图像与正确答案相同!
说明如下:
1)系统会调用你编写的enhancePixel函数,并以“原始颜色 -> 调整量 -> 调整后的颜色”的格式打印结果,如测试集第 1 行的(148, 65 , 93 ) -> 50 -> (198, 115, 143)表示:(148,65,93) 亮度调整 50 后得 (198,115,143);
2)此外,系统会检查程序生成的 step1_2.jpg 文件,若正确则在测试集最后一行打印你的图像与正确答案相同!。
开始你的任务吧,祝你成功!
from PIL import Image
########## Begin ##########
# 调整一个像素的亮度
def enhancePixel(r, g, b, n):
er, eg, eb = r + n, g + n, b + n
if 255 < er:
er = 255
elif 0 > er:
er = 0
if 255 < eg:
eg = 255
elif 0 > eg:
eg = 0
if 255 < eb:
eb = 255
elif 0 > eb:
eb = 0
return er, eg, eb
########## End ##########
# 调整图像文件1中所有像素的亮度,并将调整结果保存为图像文件2
# 图像文件1和2的路径分别为path1和path2,n为调整量
def enhanceImg(path1, path2, n):
img = Image.open(path1)
w, h = img.size
for x in range(w):
for y in range(h):
r, g, b = img.getpixel((x, y)) # 取出颜色
er, eg, eb = enhancePixel(r, g, b, n) # 调整亮度
img.putpixel((x, y), (er, eg, eb)) # 放回像素
img.save(path2)
path1 = 'step1.jpg' # 原始图像文件
path2 = 'step1_2.jpg' # 调整亮度后的图像文件
n = 50 # 调整量
enhanceImg(path1, path2, 50)