2017-10-20 59 views
0

Je lis une image de mammographie ddsm. Et après avoir normalisé le traçage. C'est l'image en niveaux de gris mais je la traite comme RVB, en copiant le même canal 3 fois. Le problème est quand j'utilise pyplot de matplotlib l'image normalisée est saturé alors que quand je conspire en utilisant scipy.misctoimage, il nematplotlib en ligne pyplot saturé tandis que scipy.misc toimage n'est pas

Voici mon code:

from scipy import misc 
%matplotlib inline 
import matplotlib 
import numpy as np 
import matplotlib.pyplot as plt 
img = misc.imread('testcolor.png') 
print(type(img)) #<type 'numpy.ndarray'> 
img.shape #(512,512,3) 

Les valeurs de pixel d'image sont comme ça

print(img[:,:,1]) 
#[[ 98 97 99 ..., 0 0 0] 
[ 98 98 100 ..., 0 0 0] 
[100 100 100 ..., 0 0 0] 
..., 
[ 91 95 96 ..., 0 0 0] 
[ 88 89 92 ..., 0 0 0] 
[ 95 94 97 ..., 0 0 0]] 

Je normalisé l'image avec le code suivant:

imgn = np.where(img>0,img,np.nan) 
img_norm = (img - np.nanmean(imgn,axis=(0,1)))/np.nanstd(imgn,axis=(0,1)) 

Comme précédemment pixels normalisés sont comme

print(img_norm[:,:,1]) 
#[[-0.71566175 -0.74025369 -0.69106981 ..., -3.1256717 -3.1256717 
    -3.1256717 ].... 

également

print(np.min(img_norm)) #-3.12567170176 
print(np.max(img_norm))#2.80098542174 

Avec pyplot de matplotlib Je reçois ceci:

plt.figure() 
plt.imshow(img_norm) 
plt.show() 

plot with matplotlib

Je tracer le même norma l'image lisé avec toimage de scipy.misc

from scipy.misc import toimage 
toimage(img_norm).show() 

enter image description here

Pourquoi j'ai cet écart?

BTW, l'image originale unormalized est la suivante:

enter image description here

+0

N'êtes-vous pas censé utiliser 'uint8' pour montrer l'image? De plus, qu'en est-il des nombres négatifs dans 'img_norm'? – Divakar

Répondre

1

Habituellement, il aide à lire the documentation.

matplotlib.pyplot.imshow(X, ....)

X: array_like, la forme (n, m) ou (n, m, 3) ou (n, m, 4)

afficher l'image en X aux axes actuels. X peut être un tableau ou une image PIL. Si X est un tableau, il peut avoir les formes et types:

MxN - valeurs à mappées (float ou int)
MxNx3 - RVB (flotteur ou uint8)
MxNx4 - RGBA (flotteur ou uint8)
La valeur de chaque composant des matrices flottantes MxNx3 et MxNx4 doit être comprise entre 0,0 et 1,0. Les tableaux MxN sont mappés sur des couleurs basées sur la norme (mappage scalaire vers scalaire) et le cmap (mappage du scalaire normé sur une couleur).

Votre tableau est un tableau flottant, mais pas compris entre 0 et 1. Le comportement de imshow est indéfini.

Vous pouvez normaliser à la plage entre 0 et 1 en utilisant des opérations mathématiques normales ou, potentiellement plus facilement en utilisant plt.Normalize, dans le cas où vous voulez un mappage linéaire.

norm = plt.Normalize(0,1) 
plt.imshow(norm(img_norm))