Нелинейное масштабирование изображения по оси рисунка matplotlib
введите описание изображения здесь, я надеюсь, что не посмотрел, как ранее заданный вопрос. Я так не думаю. У меня есть изображение спектра. У меня есть несколько лазерных линий для калибровки. Поскольку лазерные линии и спектр были собраны таким же образом, они должны коррелироваться на расстоянии в пикселях. Соотношение между числом пикселей и длиной волны нелинейное. Я подгонял номер пикселя вдоль оси x к длине волны лазерных линий (синий @ 405 нм зеленый @ 532 нм и красный @ 650 нм), используя полином 3-й степени с высокой корреляцией. Я хочу построить спектр путем вычисления длины волны (нм) непосредственно из числа пикселей и отобразить длину волны под спектром. Возможно ли это без наложения изображения на другую фигуру? спектрограф лазерных линий
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 ответ
Вероятно, самый простой вариант - это использовать 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 цветовых канала, необходимо использовать color
Аргумент pcolormesh для установки цвета каждого пикселя, как показано в этом вопросе: Построение изображения RGB с нерегулярно расположенными в 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()