Не так давно я наткнулся на игру, в которую играл много лет назад. Я думаю, многие при поиске отличий ломали себе глаза долгое время. Сегодня я решил пройти её еще раз, но проходить её с 0 мне было, честно говоря, лень. Поэтому я решил написать себе помощника. В статье будет рассказано одно из решений, не наилучшее, но самое понятное для новичков. Итак, начнем.
Писал я всё на python 2.7
Использовалась библиотека PIL
from PIL import Image, ImageDraw
Далее необходимо описать все функции и методы, которые мы будем использовать, для того, чтобы всем был понятен дальнейший код.
image1 = Image.open("1.jpg")
Так мы открываем нужный нам файл.
pix1 = image1.load()
Записываем в pix1 цвета всех пикселов картинки. Теперь по координате пикселя мы можем получить его цвет.
draw = ImageDraw.Draw(ANS)
Создание инструмента для рисования.
image1.size
Возвращает пару (ширина и высота картинки).
draw.ellipse((x, y), (255, 255, 255))
Рисование белой точки по заданным координатам.
ANS.save("ans.png", "PNG")
Сохранение изображения в формате PNG. Если не указан полный путь, то сохраняется в папку с исполняемой программой.
del draw
Удаление инструмента «draw».
Приступим к главному…
Откроем файлы, которые мы хотим сравнивать.
from PIL import Image, ImageDraw
image1 = Image.open("1.jpg") # Картинка № 1
image2 = Image.open("2.jpg") # Картинка № 2
ANS = Image.open("1.jpg") # Результат
Теперь создадим кисть и выгрузим из картинок все данные о цветах пикселов.
from PIL import Image, ImageDraw
image1 = Image.open("1.jpg") # Картинка № 1
image2 = Image.open("2.jpg") # Картинка № 2
ANS = Image.open("1.jpg") # Результат
draw = ImageDraw.Draw(ANS)
pix1 = image1.load()
pix2 = image2.load()
Необходимо определить размеры изображений. Так как они могут немного различаться, то возьмем минимальное из них, для того, чтобы не обратиться к несуществующим пикселам.
from PIL import Image, ImageDraw
image1 = Image.open("1.jpg") # Картинка № 1
image2 = Image.open("2.jpg") # Картинка № 2
ANS = Image.open("1.jpg") # Результат
draw = ImageDraw.Draw(ANS)
pix1 = image1.load()
pix2 = image2.load()
width = min(image1.size[0], image2.size[0])
height = min(image1.size[1], image2.size[1])
Осталось последнее. Будем перебирать пикселы и считать разность их значений.
from PIL import Image, ImageDraw
image1 = Image.open("2_1.jpg")
image2 = Image.open("2_2.jpg")
ANS = Image.open("2_1.jpg")
draw = ImageDraw.Draw(ANS)
pix1 = image1.load()
pix2 = image2.load()
width = min(image1.size[0], image2.size[0])
height = min(image1.size[1], image2.size[1])
eps = 30
for i in range(width):
for j in range(height):
dx1 = pix1[i, j][0] - pix2[i, j][0]
dx2 = pix1[i, j][1] - pix2[i, j][1]
dx3 = pix1[i, j][2] - pix2[i, j][2]
draw.point((i, j), (abs(dx1), abs(dx2), abs(dx3))) # Зарисовываем ответ разницей пикселов наших картинок по модулю.
ANS.save("ans.jpg", "JPEG")
del draw
Если немного подправить код.