2017-09-28 2 views
1

Tentative de mise en forme de la mise en forme directe d'une matrice d'homographie dans OpenCV. Vous n'avez pas besoin de savoir ce que cela signifie pour comprendre le problème.Définition d'images opencv/valeurs de tableau numpy à l'aide d'un tableau de pixels

suppose qu'il y a 2 images (une image est un tableau 2D Numpy de valeurs de pixels), A et B, et un tableau match qui ressemble

[[ 6.96122642e+01 -1.06556338e+03 1.02251944e+00] 
[ 6.92265938e+01 -1.06334423e+03 1.02246589e+00] 
[ 6.88409234e+01 -1.06112508e+03 1.02241234e+00] 
... ] 

La première colonne est X, deuxième Y, et le troisième est un scalaire. Ces valeurs XY sont l'image des indices de pixels A et correspondent aux indices imageB

[[0,0], 
[0,1], 
[0,2] 
... ] 

Je veux utiliser cette information pour définir rapidement les valeurs de imageB de imageA. J'ai ce travail, mais ce n'est pas aussi vite que je voudrais

yAs = np.int32(np.round(match[:, 0]/match[:, 2]) 
xAs = np.int32(np.round(match[:, 1]/match[:, 2]) 
it = np.nditer(pixelsImageB[0], flags=['f_index']) 
while not it.finished: 
    i = it.index  
    xA = xAs[i] 
    yA = yAs[i] 
    if in_bounds(xA, yA, imageA): 
     yB = pixB[0][i] 
     xB = pixB[1][i] 
     imageB[xB,yB] = imageA[xA,yA] 

    it.iternext() 

Mais je ne sais pas comment faire ce jeûne dans Numpy, cette boucle fait naïvement est très lent. Je suis un scrub total à l'indexation avancée, la diffusion, et autres. Des idées?

+0

'x' et' y' ressemblent aux premiers candidats à sortir de la boucle. par exemple. 'x = np.int32 (np.round (match [:, 0]/match [:, 2]))' –

+0

Qu'est-ce que 'in_bounds'? – Divakar

+0

x ou y est> 0 et

Répondre

1

Le moyen le plus rapide serait de ne pas réinventer la roue et d'utiliser la fonction cv.WarpPerspective.

Alternativement, vous pouvez utiliser la méthode Pillow Image.transform qui selon docs a un léger avantage sur OpenCV en ce qu'elle supporte également l'interpolation bicubique, ce qui devrait produire une sortie de meilleure qualité.

+0

Absolument, c'est la meilleure option si vous voulez vraiment faire des choses. Je l'implémente juste pour apprendre comment ça marche et j'espérais en apprendre un peu plus sur Numpy ici aussi –

+0

Ok, alors 1) vous déplacez la condition (in_bounds) en dehors de la boucle en créant un masque: remplacez simplement x/y dans le l'expression que vous avez écrite avec xAs et yAs, enregistrez-la dans une variable de masque; 2) puis faire la diffusion simplement comme ceci: imageB [pixB [1, masque], pixB [0, masque]] = imageA [xAs [masque], yAs [masque]] – lomereiter