一位计算机科学专业的学生在作业中需要编写一个函数来比较两张图片的差异,他遇到了一些问题,导致函数无法正常工作。以下是他提供的代码:
def smart_difference(pic1, pic2):
'''Given two Pictures, pic1 and pic2 of any size and colour, return the
difference'''
red = red_average(pic2)
blue = blue_average(pic2)
green = green_average(pic2)
pic1_height, pic1_width = media.get_height(pic1), media.get_width(pic1)
pic2_height, pic2_width = media.get_height(pic2), media.get_width(pic2)
if (pic1_height > pic2_height) and (pic1_width > pic2_width):
new_pic1 = media.create_picture(pic2_width, pic2_height)
new_pic2 = pic2
elif (pic1_height > pic2_height) and (pic2_width > pic1_width):
new_pic1 = media.create_picture(pic2_width, pic1_height)
new_pic2 = media.create_picture(pic2_width, pic1_height)
elif (pic2_height > pic1_height) and (pic2_width > pic1_width):
new_pic1 = pic1
new_pic2 = media.create_picture(pic1_width, pic1_height)
elif (pic2_height > pic1_height) and (pic1_width > pic2_width):
new_pic1 = media.create_picture(pic2_width, pic1_height)
new_pic2 = media.create_picture(pic2_width, pic1_height)
scale_red(new_pic1, red)
scale_blue(new_pic1, blue)
scale_green(new_pic1, green)
scale_red(new_pic2, red)
scale_blue(new_pic2, blue)
scale_green(new_pic2, green)
return simple_difference(new_pic1, new_pic2)
2、解决方案
仔细分析代码可以发现,函数存在以下问题:
red_average(pic2),blue_average(pic2),green_average(pic2)及simple_difference(new_pic1, new_pic2)函数并未在代码中定义。media模块也未在代码中导入。
因此,需要在代码中导入必要的模块,并定义上述函数,代码如下:
import media
def smart_difference(pic1, pic2):
'''Given two Pictures, pic1 and pic2 of any size and colour, return the
difference'''
red = red_average(pic2)
blue = blue_average(pic2)
green = green_average(pic2)
pic1_height, pic1_width = media.get_height(pic1), media.get_width(pic1)
pic2_height, pic2_width = media.get_height(pic2), media.get_width(pic2)
if (pic1_height > pic2_height) and (pic1_width > pic2_width):
new_pic1 = media.create_picture(pic2_width, pic2_height)
new_pic2 = pic2
elif (pic1_height > pic2_height) and (pic2_width > pic1_width):
new_pic1 = media.create_picture(pic2_width, pic1_height)
new_pic2 = media.create_picture(pic2_width, pic1_height)
elif (pic2_height > pic1_height) and (pic2_width > pic1_width):
new_pic1 = pic1
new_pic2 = media.create_picture(pic1_width, pic1_height)
elif (pic2_height > pic1_height) and (pic1_width > pic2_width):
new_pic1 = media.create_picture(pic2_width, pic1_height)
new_pic2 = media.create_picture(pic2_width, pic1_height)
scale_red(new_pic1, red)
scale_blue(new_pic1, blue)
scale_green(new_pic1, green)
scale_red(new_pic2, red)
scale_blue(new_pic2, blue)
scale_green(new_pic2, green)
return simple_difference(new_pic1, new_pic2)
def red_average(pic):
red_total = 0
for x in range(0, media.get_width(pic)):
for y in range(0, media.get_height(pic)):
red_total += media.get_red(pic, x, y)
return red_total / (media.get_width(pic) * media.get_height(pic))
def blue_average(pic):
blue_total = 0
for x in range(0, media.get_width(pic)):
for y in range(0, media.get_height(pic)):
blue_total += media.get_blue(pic, x, y)
return blue_total / (media.get_width(pic) * media.get_height(pic))
def green_average(pic):
green_total = 0
for x in range(0, media.get_width(pic)):
for y in range(0, media.get_height(pic)):
green_total += media.get_green(pic, x, y)
return green_total / (media.get_width(pic) * media.get_height(pic))
def scale_red(pic, red_average):
for x in range(0, media.get_width(pic)):
for y in range(0, media.get_height(pic)):
old_red = media.get_red(pic, x, y)
percent = 255 / red_average
new_red = int(old_red * percent)
media.set_red(pic, x, y, new_red)
def scale_blue(pic, blue_average):
for x in range(0, media.get_width(pic)):
for y in range(0, media.get_height(pic)):
old_blue = media.get_blue(pic, x, y)
percent = 255 / blue_average
new_blue = int(old_blue * percent)
media.set_blue(pic, x, y, new_blue)
def scale_green(pic, green_average):
for x in range(0, media.get_width(pic)):
for y in range(0, media.get_height(pic)):
old_green = media.get_green(pic, x, y)
percent = 255 / green_average
new_green = int(old_green * percent)
media.set_green(pic, x, y, new_green)
def simple_difference(pic1, pic2):
total_difference = 0
for x in range(0, media.get_width(pic1)):
for y in range(0, media.get_height(pic1)):
red_diff = abs(media.get_red(pic1, x, y) - media.get_red(pic2, x, y))
green_diff = abs(media.get_green(pic1, x, y) - media.get_green(pic2, x, y))
blue_diff = abs(media.get_blue(pic1, x, y) - media.get_blue(pic2, x, y))
total_difference += red_diff + green_diff + blue_diff
return total_difference
之后就可以正常运行函数比较图片的差异。