2017-02-22 5 views
3

Я создаю программу сшивания с использованием OpenCV и python и в настоящее время сшиваю изображения хорошо, и теперь я пытаюсь их объединить. Конечной целью будет использование графика, чтобы лучше сшить их, но на данный момент я просто перекрываю изображения, основываясь на их найденной гомографии.OpenCV определяет область пересечения/перекрытия

Вот фотография моего текущего результата при сшивании двух изображений. enter image description here

Моя цель состоит в том, чтобы определить площадь перекрытия и положить его в маску, что я могу применить к верхнему правому изображению (то есть один на вершине в плане слоев), так что я могу смешать его на основе расстояние с использованием любого из используемых blender opencv или другого алгоритма.

Вот визуальное представление о том, что я ищу. enter image description here

Любая помощь приветствуется.

ответ

3

Как насчет создания маски/двоичного изображения обоих и использовать логический И?

Вы также можете перевести серую копию каждого изображения (содержимое изображения всех) в новую копию адресата (инициализированную нулями) для каждого.

Затем вы добавляете все эти изображения назначения вверх. Области с 0 были бы раскрыты, 1 покрыт и 2 to n будет означать покрытый 2 to n изображений.

Это очень просто и эффективно при использовании средств вещания numpy.

import cv2 
import numpy as np 

#our target area (the black background) 
dst = np.zeros((100,100),dtype=np.int) 
src1 = dst.copy() 
src2 = dst.copy() 
src1[50:,50:] = 1 #fake of first translated image (row/col 50-end) 
src2[:70,:70] = 1 #fake of second translated image (row/col 0-70) 

overlap = src1+src2 #sum of both *element-wise* 

cv2.imwrite('a.png', src1*255) #opencv likes it's grey images span from 0-255 
cv2.imwrite('b.png', src2*255) #... 
cv2.imwrite('c.png', overlap*127) #here vals 0-2, *127 gives (almost) 255 again 

np.where(overlap==2) #gives you a mask with all pixels that have value 2 

источник2 (б) enter image description here + src1 (а) enter image description here = перекрытия (с) enter image description here

Надежда, что помогает.

+0

Спасибо, что имеет много смысла. Я понимаю концепцию, но как одна нормальная область изображения? Моя проблема заключается в том, что многослойное/сшитое изображение представляет собой одно изображение, а не изображение с несколькими слоями. –

+0

Извините, нормировка - это неправильное имя здесь - просто установите все значения пикселей на 1, чтобы сделать трюк. Я расширяю свой ответ прямо сейчас. – RuDevel

+0

Спасибо, что это отлично работает, за исключением одной маленькой вещи в вашем коде. dst = np.zeros ((100,100), dtype = np.int) должно быть dst = np.zeros ((100,100), np.uint8). Это действительно помогло спасибо –

Смежные вопросы