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

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

Время на прочтение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





















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

Публикации

Истории

Работа

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

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

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
24 – 25 октября
One Day Offer для AQA Engineer и Developers
Онлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
26 октября
ProIT Network Fest
Санкт-Петербург
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань