【问题标题】:nonlinear scaling image in figure axis matplotlib图轴matplotlib中的非线性缩放图像
【发布时间】:2017-12-28 20:52:25
【问题描述】:

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

【问题讨论】:

  • 您的图像也是全白的。所以很难想象你想要什么。
  • 我很抱歉。我省略了等式中的幂
  • 我曾多次尝试上传 .jpg 文件,但它们显示为白色。可以说图像反映了三个激光线的光谱色散,这些激光线遵循上式中表达的关系,其中 i 是图像中的像素数(x 轴),x 是波长空间中的 x 轴。

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


【解决方案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()

【讨论】:

  • 感谢 ImportanceOfBeingErnst,这看起来很有希望。但是,当我将图像替换为您的代码时,我收到以下错误。 ---> 17 ax.pcolormesh(Xw, Yi, image) ValueError: too many values to unpack (expected 2)
  • 上面的代码似乎适用于灰度图像,但不适用于 RGB 图像。
  • 从问题中不清楚您是否有 RGB 图像。我更新了答案以包含该案例。
  • 优秀。非常感谢您的专业知识。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
相关资源
最近更新 更多