内联matplotlib pyplot饱和而scipy.misc toimage不是

时间:2017-10-20 18:42:59

标签: python image numpy matplotlib scipy

我正在阅读ddsm乳房X线照片。在规范化绘图之后。这是灰度图像,但我将其视为RGB,通过复制相同的通道3次。问题是当我使用来自matplotlib的{​​{1}}时,归一化图像会变得饱和,而当我使用scipy.misc toimage绘图时,它不会

这是我的代码:

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)

图像像素值是这样的

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

然后我使用以下代码对图像进行标准化:

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

之前的归一化像素就像

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

另外

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

使用matplotlib pyplot,我得到了这个:

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

plot with matplotlib

然后我使用toimage

中的scipy.misc绘制相同的标准化图像
from scipy.misc import toimage
toimage(img_norm).show()

enter image description here

为什么我会出现这种差异?

顺便说一下,非正规化的原始图像就是这样:

enter image description here

1 个答案:

答案 0 :(得分:1)

通常阅读the documentation会很有帮助。

  

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

     

X:array_like,shape(n,m)或(n,m,3)或(n,m,4)

     

将X中的图像显示到当前轴。 X可以是阵列或PIL图像。如果X是一个数组,它可以具有以下形状和类型:

     

MxN - 要映射的值(float或int)
  MxNx3 - RGB(浮点数或uint8)
  MxNx4 - RGBA(float或uint8)
   MxNx3和MxNx4浮点数组件的每个组件的值应在0.0到1.0范围内。 MxN数组根据范数(映射标量到标量)和cmap(映射范数)映射到颜色标量为一种颜色。)

您的数组是一个float数组,但不在0到1之间。因此imshow的行为未定义。

您可以使用常规数学运算将其归一化到0到1之间的范围,或者如果您想要线性映射,可以更轻松地使用plt.Normalize

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