enter image description here我希望我没有像先前提出的那样问题。我不这么认为。 我有一张光谱图像。我有几条激光线用于校准。由于激光线和光谱以相同的方式收集,因此它们应该在像素距离上相关。像素数和波长之间的关系是非线性的。我使用具有高相关性的3次多项式使x轴上的像素数与激光线的波长(蓝色@ 405nm绿色@ 532nm和红色@ 650nm)相匹配。我想通过直接从像素数计算波长(nm)来绘制光谱,并在光谱下显示波长。这可能不会在另一个图上重叠图像吗? spectrograph of Laser Lines
import matplotlib.pyplot as plt
from scipy import ndimage
from pylab import *
import numpy as np
import skimage
image= laser_lines
print(image.shape)
for i in range(image.shape[1]):
x=i^3*-3.119E-6+2.926E-3*i^2+0.173*i+269.593
for j in range(image.shape[0]):
y=image[i,j]
imshow(image)
plt.show()
答案 0 :(得分:1)
可能最简单的选择是使用pcolormesh
而不是imshow情节。 pcolormesh
显示网格的边缘,这样您可以使用像素和波长之间的函数关系简单地转换原始网格,以根据波长定义每个像素的边缘。
import numpy as np
import matplotlib.pyplot as plt
image = np.sort(np.random.randint(0,256,size=(400,600)),axis=0)
f = lambda i: i**3*-3.119E-6+2.926E-3*i**2+0.173*i+269.593
xi = np.arange(0,image.shape[1]+1)-0.5
yi = np.arange(0,image.shape[0]+1)-0.5
Xi, Yi = np.meshgrid(xi, yi)
Xw = f(Xi)
fig, (ax) = plt.subplots(figsize=(8,4))
ax.pcolormesh(Xw, Yi, image)
ax.set_xlabel("wavelength [nm]")
plt.show()
如果图像有3个颜色通道,则需要使用pcolormesh的color
参数来设置每个像素的颜色,如以下问题所示:Plotting an irregularly-spaced RGB image in Python
import numpy as np
import matplotlib.pyplot as plt
r = np.sort(np.random.randint(0,256,size=(200,600)),axis=1)
g = np.sort(np.random.randint(0,256,size=(200,600)),axis=0)
b = np.sort(np.random.randint(0,256,size=(200,600)),axis=1)
image = np.dstack([r, g, b])
color = image.reshape((image.shape[0]*image.shape[1],image.shape[2]))
if color.max() > 1.:
color = color/255.
f = lambda i: i**3*-3.119E-6+2.926E-3*i**2+0.173*i+269.593
xi = np.arange(0,image.shape[1]+1)-0.5
yi = np.arange(0,image.shape[0]+1)-0.5
Xi, Yi = np.meshgrid(xi, yi)
Xw = f(Xi)
fig, (ax) = plt.subplots(figsize=(8,4))
pc = ax.pcolormesh(Xw, Yi, Xw, color=color )
pc.set_array(None)
ax.set_xlabel("wavelength [nm]")
plt.show()