我正在阅读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()
然后我使用toimage
scipy.misc
绘制相同的标准化图像
from scipy.misc import toimage
toimage(img_norm).show()
为什么我会出现这种差异?
顺便说一下,非正规化的原始图像就是这样:
答案 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))