我试图理解为matplotlib imshow()函数提供的矩阵值如何确定灰度模式下像素的强度.考虑示例代码:
import random
import matplotlib.pyplot as plt
import matplotlib.cm as cm
def pixels(n=3):
pixel_data = []
for _ in range(n):
row = []
for _ in range(n):
row.append(random.randint(1, 10))
pixel_data.append(row)
return pixel_data
if __name__ == '__main__':
pixel_data = pixels()
print(pixel_data)
plt.imshow(pixel_data, origin='lower', cmap=cm.Greys_r)
plt.show()
Run Code Online (Sandbox Code Playgroud)
这里的pixel_data是3*3"矩阵":
[[7, 4, 6], [7, 7, 6], [4, 7, 9]]
Run Code Online (Sandbox Code Playgroud)
这里的值如何确定我在图像中看到的灰色阴影?
Ima*_*ngo 12
只是一个简单的例子:
import numpy as np
data = array([[7, 4, 6], [7, 7, 6], [4, 7, 9]])
imshow(data, 'gray', origin='lower')
Run Code Online (Sandbox Code Playgroud)

Matplotlib imshow有3个控制每个像素灰度的参数:
vmin:设置图像的最小强度值(灰度中的黑色),默认情况下设置为图像阵列的最小值.vmax:设置图像的最大强度值(灰度为白色),默认设置为数组的最大值.如果要查看真实的灰度图像,则需要手动设置vmin=0和vmax=255(对于8位灰度图像).或者将数组重新调整为[0,255].
interpolation:默认设置为双线性插值,如果图像大小大于或小于图像矩阵的大小,则控制插值像素的值.这是因为关闭插值会发生什么的结果:
imshow(data, 'gray', origin='lower', interpolation='none')
Run Code Online (Sandbox Code Playgroud)

这是函数vmin和vmax参数的一个例子:
imshow(data, 'gray', origin='lower', interpolation='none', vmin=0, vmax=20)
Run Code Online (Sandbox Code Playgroud)

有关双线性插值或插值方法的更多信息,请参阅维基百科或:
http://matplotlib.org/examples/images_contours_and_fields/interpolation_methods.html
其中none = nearest反映原始4x4数组没有插值.
编辑:基本上,当您可视化图像时有两个关键因素:
如果以上两种尺寸相同,则图像以其原始尺寸可视化,完全没有问题,但是,这在现实世界中很少发生.想象一下,一个简单的例子,两个人在不同分辨率的两个显示器(假设相同型号)中寻找相同的图像:一个用1280x768,另一个用800x600.显示器实际上具有相同的尺寸,在两种情况下图像都是相同的,但是,两个显示器中的像素密度不同(第一个像素每英寸的像素数多于第二个),因此, 800x600显示器将寻找更大(质量更差)的画面.
不同的情况,但matplotlib发生类似的事情.默认情况下,Matplotlib未经过优化,无法以原始大小显示图像.实际上,如果你显示你的3x3矩阵,你甚至都看不到它(太小)但是,默认情况下,matplotlib会显示一个(比方说256x256)大的类似平滑的图像(上面的第一张图片).
这一切背后发生了什么?figure的figsize和dpi参数控制输出图像的大小和像素密度.如果没有手动给出,matplotlib将默认尝试估计.
因此,无论是手动给定还是默认创建,您的3x3矩阵最终都会有256x256像素.如上所述,vmin并vmax控制颜色的最小值和最大值(在这种情况下为灰度,so vmin = black和vmax = white).
那么,如何确定每个像素的值?这取决于所使用的插值方法.首先,您的矩阵(3x3在本例中)点沿着图像的大小均匀分布(256x256例如).然后,256x256使用插值方法估计新图像()的其余点:
无插值:像素获得其最接近矩阵元素的值
双线性插值:像素获得在矩阵的最近4个邻居内平均的值
还有更多......有关详细信息,请参阅上面的插值方法.
例如,请查看维基百科的以下图片:

想象一下,带有颜色的点是来自矩阵的数据,黑点代表当您使图像大小大于矩阵大小时需要估算的像素之一.在图像的特定情况下,使用双线性插值来估计黑点(对于新图像)的值.如您所见,像素的值设置为围绕该像素的矩阵中点的加权平均值.如果在matplotlib中将插值方法设置为"无"或"最近",则黑点的值将仅由黄色像素给出(它最接近一个).
请看这里有关插值的更多信息:http: //www.cambridgeincolour.com/tutorials/image-interpolation.htm
此外,期待在这里认识到如何复杂,实际上是与matplotlib原来的像素尺寸的可视化图像.