TANSOT

Stopień podobieństwa między dwoma obrazami

10.01.2020 21:11

Aby obliczyć stopień podobieństwa dwóch obrazów (np. w celu oceny efektywności kompresji) można posłużyć się następującym skryptem Pythona (wersja 3.x):

#!/usr/bin/env python3
from PIL import Image
import numpy as np

class Difference:
    def __init__(self, original, modified):
        self.original = original
        self.modified = modified
        self.mse = ((original - modified)**2).mean(axis=None)

def load_image(filename):
    image = Image.open(filename).convert('RGBA')
    image.load()
    data = np.asarray(image, dtype="int32")
    return data

if __name__ == '__main__':
    import sys

    original = load_image(sys.argv[1])
    modified = load_image(sys.argv[2])
    difference = Difference(original, modified)
    print("MSE = ", difference.mse)

Wartością opisującą skalę rozbieżności obrazów jest MSE, które w tym przypadku oznacza średnią odległość kolorów, które w modelu RGB mają zakres od 0 do 255. Jako odległość brany jest kwadrat ich różnicy.

Zatem jeśli porównamy obraz wypełniony kolorem #000000 z obrazem wypełnionym kolorem #FFFFFF, to MSE wyniesie 255² = 65025.

Skrypt wymaga zainstalowanego PILnumpy. Pod Arch Linuksem można zainstalować te pakiety z repozytorium:

# pacman -S python-numpy python-pillow

Używamy w następujący sposób:

$ python3 mse.py obraz1.png obraz2.png

W następnym odcinku spróbujemy zaimplementować metody bardziej naśladujące działanie ludzkiego układu wzrokowego.