trabajar - roi opencv python
Cómo encontrar una imagen dentro de otra imagen usando python (4)
EDIT: Ok, aquí está la forma ingenua de hacer esto:
import Image, numpy
def subimg(img1,img2):
img1=numpy.asarray(img1)
img2=numpy.asarray(img2)
#img1=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
#img2=numpy.array([[0,0,0,0,0],[0,1,2,3,0],[0,4,5,6,0],[0,7,8,9,0],[0,0,0,0,0]])
img1y=img1.shape[0]
img1x=img1.shape[1]
img2y=img2.shape[0]
img2x=img2.shape[1]
stopy=img2y-img1y+1
stopx=img2x-img1x+1
for x1 in range(0,stopx):
for y1 in range(0,stopy):
x2=x1+img1x
y2=y1+img1y
pic=img2[y1:y2,x1:x2]
test=pic==img1
if test.all():
return x1, y1
return False
small=Image.open(''small.tif'')
big=Image.open(''big.tif'')
print subimg(small, big)
Funciona bien, pero quiero VELOCIDAD. Creo que la clave está en la matriz ''prueba'' que podríamos usar para omitir algunas posiciones en la imagen.
Edición 2: asegúrese de utilizar imágenes en un formato sin pérdidas para probar esto.
En Mac
, instale Pillow y from PIL import Image
Estoy tratando de usar python para determinar si una imagen (pequeña) está dentro de otra imagen (grande).
¿Alguna sugerencia antes de que me tome por el camino equivocado?
/ edit: Ok, algunas ideas: estoy usando PIL y estoy convirtiendo cada imagen al modo ''P'' para poder comparar cada píxel como un entero. Estoy tratando de implementar algo como una búsqueda de cuerdas Boyer-Moore o el algoritmo Knuth-Morris-Pratt, pero en 2 dimensiones.
Quizás esto ayude: en lugar de buscar ABC in XXXABCXXX
(respuesta = 4) estamos buscando
ABC
DEF
GHI
en
XXXXX
XABCX
XDEFX
XGHIX
XXXXX
(respuesta = (2,2))
Eche un vistazo a mi respuesta a una pregunta similar para un ejemplo de código usando OpenCV . La conversión de PIL a numpy es sencilla, por ejemplo, simplemente use np.array(pilimage)
.
Sé que es un poco tarde, pero puede usar Boyer-Moore para buscar la primera línea de la imagen pequeña en cada una de las líneas de la imagen grande. En el momento en que encuentra una coincidencia, tiene la posición X e Y y solo tiene que verificar si el resto de las líneas de la imagen más pequeña coincide con el resto de las líneas de la imagen más grande que comienzan en la posición X e Y + 1,2. 3, ... En el primer desajuste continuar con la búsqueda de la primera línea. No creo que puedas llegar más rápido que esto.