图轴matplotlib中的非线性缩放图像

时间:2017-07-23 01:28:47

标签: python image python-3.x matplotlib axis-labels

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()

1 个答案:

答案 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()

enter image description here

如果图像有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()