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

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

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

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
Находит даже при не идеальном совпадении. Правда есть косяк: если такого фрагмента не существует - находит рандомный, максимально похожий по цветам., что не есть гуд. Если кто поможет допилить в моем примере проверку, а найден ли, собственно, этот фрагмент (на сколько % схожесть или типа того) - буду благодарен.
Singularity
hexkey
сам придумал решение
Cкорей сам таки прочел доку и нашел нужную функцию…
leocode
Singularity
Написали бы как решилась задача ))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB