Как стать автором
Обновить

Пишем бота для игры «Найди отличие»

Время на прочтение 2 мин
Количество просмотров 37K

Не так давно я наткнулся на игру, в которую играл много лет назад. Я думаю, многие при поиске отличий ломали себе глаза долгое время. Сегодня я решил пройти её еще раз, но проходить её с 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





















Если немного подправить код.
Теги:
Хабы:
+25
Комментарии 55
Комментарии Комментарии 55

Публикации

Истории

Работа

Data Scientist
66 вакансий
Python разработчик
136 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн