Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 15, 2013 11:38:55

hexkey
Зарегистрирован: 2013-12-15
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск координат элемента изображения по маске

Всех приветствую.
С пайтаном работаю совсем не много, но тут встала задача…
Есть 2 графических файла: image.png - большая картинка, object.png - элемент, который содержится в image.png на прозрачном фоне. Как получить координаты object.png на image.png? Гуглил много, ничего конкретного не нашел. Набрел на OpenCV, разобраться не могу. Сдается мне, что решить задачу можно куда проще. Буду крайне признателен за любые советы, ссылки и т.д.

Офлайн

#2 Дек. 15, 2013 12:33:37

alexiy
Зарегистрирован: 2013-10-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск координат элемента изображения по маске

hexkey
Всех приветствую.С пайтаном работаю совсем не много, но тут встала задача…Есть 2 графических файла: image.png - большая картинка, object.png - элемент, который содержится в image.png на прозрачном фоне. Как получить координаты object.png на image.png? Гуглил много, ничего конкретного не нашел. Набрел на OpenCV, разобраться не могу. Сдается мне, что решить задачу можно куда проще. Буду крайне признателен за любые советы, ссылки и т.д.

По пикселям сравнивать всё подряд из image.png. Сохранить в массиве какую-то часть цветов из середины маленькой картинки и искать точно такой-же набор пикселей на большой картинке перебором. Если картинки не размером в гигабайты, то быстро сработает.

Отредактировано alexiy (Дек. 15, 2013 12:33:52)

Офлайн

#3 Дек. 15, 2013 12:46:29

hexkey
Зарегистрирован: 2013-12-15
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск координат элемента изображения по маске


alexiy
По пикселям сравнивать всё подряд из image.png. Сохранить в массиве какую-то часть цветов из середины маленькой картинки и искать точно такой-же набор пикселей на большой картинке перебором. Если картинки не размером в гигабайты, то быстро сработает.
Спасибо, но по логике вопросов нет, Вы все правильно описали. Вопрос как раз и состоит в том, как описанное Вами реализовать… Если покажите пример - буду премного благодарен.

Офлайн

#4 Дек. 15, 2013 14:09:47

alexiy
Зарегистрирован: 2013-10-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск координат элемента изображения по маске

hexkey
Спасибо, но по логике вопросов нет, Вы все правильно описали. Вопрос как раз и состоит в том, как описанное Вами реализовать… Если покажите пример - буду премного благодарен.

Как-то так.
Как пример, картинка 660 на 371 - http://filmpro.ru/media/images/uploaded/bb_horizontal_bigger19426753.jpg
Надо найти барабан револьвера (он вырезан отдельно):

from PIL import Image
 
def get_mask(img, x_start, y_start):
	mask = []
 
	for x in range(10):
		mask_y = []
		for y in range(10):
			mask_y.append(img[x_start + x, y_start + y])
		mask.append(mask_y)
 
	return mask
 
 
img = Image.open("milla.png")
img = img.convert("RGBA")
pixdata_img = img.load()
 
gun = Image.open("milla-part.png")
gun = gun.convert("RGBA")
pixdata_gun = gun.load()
 
search_mask = get_mask(pixdata_gun, gun.size[0]/2 - 5, gun.size[1]/2 - 5)
 
 
for x in range(img.size[0]-10):
	for y in range(img.size[1]-10):
		if pixdata_img[x, y] == search_mask[0][0]:
			pixdata_mask = get_mask(pixdata_img, x, y)
			if pixdata_mask == search_mask:
				print "Search image coordinates: [{}, {}]".format(x+5,y+5)

т.е. взят квадрат 10 на 10 пикселей из середины картинки барабана.
Полученные координаты: (556, 196), совпадает с точностью до пикселя при условии, что картинки абсолютно идентичные по цветам.

Отредактировано alexiy (Дек. 15, 2013 14:12:26)

Офлайн

#5 Дек. 16, 2013 09:40:04

hexkey
Зарегистрирован: 2013-12-15
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск координат элемента изображения по маске

Спасибо за помощь, сам вчера придумал решение, работает отлично, даже лучше, чем требовалось.

import sys
import cv2
source = cv2.imread('test.png')
object = cv2.imread('object.png')
result = cv2.matchTemplate(source,object,cv2.TM_CCOEFF_NORMED)
y,x = np.unravel_index(result.argmax(), result.shape)
print y,x
Находит даже при не идеальном совпадении. Правда есть косяк: если такого фрагмента не существует - находит рандомный, максимально похожий по цветам., что не есть гуд. Если кто поможет допилить в моем примере проверку, а найден ли, собственно, этот фрагмент (на сколько % схожесть или типа того) - буду благодарен.

Отредактировано hexkey (Дек. 16, 2013 09:40:49)

Офлайн

#6 Дек. 16, 2013 11:19:22

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Поиск координат элемента изображения по маске

hexkey
сам придумал решение
Cкорей сам таки прочел доку и нашел нужную функцию…

Офлайн

#7 Янв. 15, 2014 12:58:16

leocode
Зарегистрирован: 2013-05-16
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск координат элемента изображения по маске

Singularity
Написали бы как решилась задача ))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version