使用 Python 比较两张图片的差异

49 阅读3分钟

一位计算机科学专业的学生在作业中需要编写一个函数来比较两张图片的差异,他遇到了一些问题,导致函数无法正常工作。以下是他提供的代码:

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、解决方案

仔细分析代码可以发现,函数存在以下问题:

  1. red_average(pic2), blue_average(pic2), green_average(pic2)simple_difference(new_pic1, new_pic2) 函数并未在代码中定义。
  2. 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

之后就可以正常运行函数比较图片的差异。