2015-11-30 1 views
3

J'essaie de copier une image à la main, mais quand je le fais, le résultat est un négatif de l'image originale. Je n'arrive pas à trouver pourquoi, alors aidez s'il vous plaît.Obtention d'un négatif d'image lors de la copie de valeurs de tableau numpy

Voici le code:

def copy(image): 
    padded_image = np.ndarray(shape=image.shape) 
    for i in xrange(0, image.shape[0]): 
     for j in xrange(0, image.shape[1]): 
      padded_image[i][j] = image[i][j] 

    return padded_image 

enter image description here

Voici comment je lis l'image:

jelly_beans = io.imread("4.1.07-jelly-beans.tiff") 

Et voilà comment j'afficher les images:

def show_images(images, titles = None): 

     """Display a list of images""" 
     n_ims = len(images) 
     if titles is None: titles = ['(%d)' % i for i in range(1,n_ims + 1)] 
     fig = plt.figure() 
     n = 1 
     for image,title in zip(images,titles): 
      a = fig.add_subplot(1,n_ims,n) # Make subplot 
      if image.ndim == 2: # Is image grayscale? 
       plt.gray() 
      plt.imshow(image) 
      a.set_title(title) 
      n += 1 
     fig.set_size_inches(np.array(fig.get_size_inches()) * n_ims) 
     plt.show() 
+0

Pour les images de remplissage, s'il vous plaît utilisez '' np.pad''. La fonction '' show_images'' peut être beaucoup simplifiée en utilisant '' plt.subplots''. –

Répondre

3

Le problème est que lorsque vous avez créé padded_image en utilisant ndarray, vous n'avez pas spécifié de dtype donc il est par défaut à virgule flottante. Ensuite, vous utilisez imshow pour afficher un tableau à virgule flottante avec des valeurs qui ne sont pas normalisées dans la plage [0, 1], donc imshow fait une sorte de normalisation, ce qui donne des couleurs "opposées". (Toutes les images à virgule flottante seront inversées comme ça.)

Vous pouvez résoudre ce problème en utilisant

padded_image = np.ndarray(shape=image.shape, dtype=image.dtype) 

Cela devrait résoudre le problème immédiat. Une meilleure solution consiste simplement à ne pas écrire votre propre fonction copy. Le numpy ndarray a une méthode copy, vous pouvez le faire, par exemple,

image2 = image1.copy()