2014-10-29 23 views
9

Ho notato qualcosa di strano con scipy.misc.resize: sembra che l'utilizzo di un metodo di interpolazione diverso da "più vicino" abbia come conseguenza uno spostamento di 1x1 pixel da (0,0) nell'immagine risultante.SciPy ridimensionamento delle immagini shift - comportamento previsto o bug?

Ecco un esempio totalmente sintetica di prendere un'immagine 3x3 a 6x6:

>>> src 
array([[ 0., 0., 0.], 
     [ 0., 64., 0.], 
     [ 0., 0., 0.]]) 

>>> imresize(src, (6, 6), interp='bicubic',mode='F') 
array([[ 1., 0., -5., -8., -5., 0.], 
     [ 0., 0., 0., 0., 0., 0.], 
     [ -5., 0., 25., 40., 25., 0.], 
     [ -8., 0., 40., 64., 40., 0.], 
     [ -5., 0., 25., 40., 25., 0.], 
     [ 0., 0., 0., 0., 0., 0.]], dtype=float32) 
>>> imresize(src, (6, 6), interp='bilinear',mode='F') 
array([[ 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 16., 32., 16., 0.], 
     [ 0., 0., 32., 64., 32., 0.], 
     [ 0., 0., 16., 32., 16., 0.], 
     [ 0., 0., 0., 0., 0., 0.]], dtype=float32) 
>>> imresize(src, (6, 6), interp='nearest',mode='F') 
array([[ 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 64., 64., 0., 0.], 
     [ 0., 0., 64., 64., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0.]], dtype=float32) 

ora sembra che il centro di massa si muove per bilineare e interpolazioni bicubic, ma non si muove per l'interpolazione più vicina. Ciò si verifica per entrambe le dimensioni di destinazione pari e dispari.

Mi rendo conto che le diverse definizioni di coordinate che sono pixel-center o pixel-edge o che trattano pixel come punti campioni o rettangoli danno risultati leggermente diversi durante il ricampionamento, ma questo sembra un grosso problema (a meno che manchi qualcosa) .

Ecco un altro esempio che dimostra il passaggio più chiaro:

>>> imresize(src, (7, 3), interp='bilinear',mode='F') 
array([[ 0.  , 0.  , 0.  ], 
     [ 0.  , 0.  , 0.  ], 
     [ 0.  , 11.4285717, 11.4285717], 
     [ 0.  , 25.1428566, 25.1428566], 
     [ 0.  , 25.1428566, 25.1428566], 
     [ 0.  , 11.4285717, 11.4285717], 
     [ 0.  , 0.  , 0.  ]], dtype=float32) 

Dal momento che nessun cambiamento dimensione orizzontale si è verificato, non mi aspetto la coordinata orizzontale del mio centro di massa per spostare a tutti, ma si muove chiaramente dal da 1,0 a 1,5.

Quindi, questo è un bug o mi manca qualcosa?

+1

Questo è molto interessante. Ho osservato cose simili anche in 'PIL', ma non ho una spiegazione immediata. Il tuo ragionamento su "pixel-center" e "pixel-edge" può essere un vantaggio (sebbene ciò suggerisca che i pixel siano quadrati anziché 0d punti), oltre a considerazioni sui bordi e effetti aggiuntivi con ridimensionamento multiplo non intero. Molto interessato a tutto ciò che può far luce qui. – eickenberg

+1

Si scopre che scipy usa effettivamente 'PIL' (vedere la funzione' toimage' altrove in [questo file] (https://github.com/scipy/scipy/blob/master/scipy/misc/pilutil.py#L392)) – eickenberg

risposta

0

Sembra che questo sia sicuramente un bug. Ho scritto il seguente breve frammento:

from scipy.misc import * 
from scipy.ndimage import measurements 
import numpy as np 

src = imread("src.png") 
cbc = src 
lnr = src 
nrs = src 

for idx in xrange(0, 128): 
    cbc = imresize(cbc, tuple(2 * i for i in cbc.shape), interp='bicubic', mode='F') 
    cbc = imresize(cbc, src.shape, interp='bicubic', mode='F') 

    lnr = imresize(lnr, tuple(2 * i for i in lnr.shape), interp='bilinear', mode='F') 
    lnr = imresize(lnr, src.shape, interp='bicubic', mode='F') 

    nrs = imresize(nrs, tuple(2 * i for i in nrs.shape), interp='nearest', mode='F') 
    nrs = imresize(nrs, src.shape, interp='nearest', mode='F') 

    imsave("nrs_%03d.png" % (idx), nrs) 
    imsave("lnr_%03d.png" % (idx), lnr) 
    imsave("cbc_%03d.png" % (idx), cbc) 

e le bilineari/immagini bicubiche letteralmente a piedi da (0,0) ogni immagine, mentre più vicino rimane allineato.

controllerò con PIL/SciPy persone per vedere se è già stato risolto o meno.

+0

Hai finito per archiviare un bug report con PIL e/o SciPy per questo? Sto avendo problemi con questo comportamento ora. – aganders3

+2

Sì: https://github.com/scipy/scipy/issues/4112 –

Problemi correlati