2017-05-30 1 views
2

J'essaye de redimensionner une image .jpg avec skimage.transform.resize function. La fonction me renvoie un résultat bizarre (voir l'image ci-dessous). Je ne suis pas sûr si c'est un bug ou juste une mauvaise utilisation de la fonction.Skimage - Résultats étranges de la fonction de redimensionnement

import numpy as np 
from skimage import io, color 
from skimage.transform import resize 

rgb = io.imread("../../small_dataset/" + file) 
# show original image 
img = Image.fromarray(rgb, 'RGB') 
img.show() 

rgb = resize(rgb, (256, 256)) 
# show resized image 
img = Image.fromarray(rgb, 'RGB') 
img.show() 

Image originale:

original

image redimensionnée:

resized

J'ai vérifié allready skimage resize giving weird output, mais je pense que mon bug a différentes propeties.

Mise à jour: Aussi la fonction rgb2lab a un bug similaire.

Répondre

3

Le problème est que skimage convertit le type de données de pixel de votre tableau après le redimensionnement de l'image. L'image originale a un 8 bits par pixel, de type numpy.uint8, et les pixels redimensionnés sont numpy.float64 variables.

L'opération de redimensionnement est correcte, mais le résultat n'est pas affiché correctement. Pour résoudre ce problème, je propose 2 approches différentes:

  1. À changement de la structure de données de l'image résultante. Avant de changer de Uint8 valeurs, les pixels doivent être convertis en une échelle 0-255, car ils sont sur une échelle normalisée 0-1:

    # ... 
    # Do the OP operations ... 
    resized_image = resize(rgb, (256, 256)) 
    # Convert the image to a 0-255 scale. 
    rescaled_image = 255 * resized_image 
    # Convert to integer data type pixels. 
    final_image = rescaled_image.astype(np.uint8) 
    # show resized image 
    img = Image.fromarray(final_image, 'RGB') 
    img.show() 
    
  2. Pour utiliser une autre bibliothèque pour afficher l'image. En regardant le Image library documentation, il n'y a pas de mode supportant les images 3xfloat64 pixels. Cependant, la bibliothèque scipy.misc dispose des outils appropriés pour convertir le format de tableau afin d'afficher correctement:

    from scipy import misc 
    # ... 
    # Do OP operations 
    misc.imshow(resized_image) 
    
+0

Merci qui a résolu mon problème. L'utilisation de 'matplotlib' est également acceptable. – Primoz