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?
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
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