You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于RGB图像绘制相机灵敏度-波长分布图的技术求助

解决步骤与代码实现

1. 图像预处理与光谱数据提取

从光栅照片中提取RGB各通道的强度数据,先裁剪出光谱所在区域,再对每一列计算平均强度:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像并转换为RGB格式
img = cv2.imread('your_spectrum_photo.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 裁剪光谱区域:根据照片实际情况调整上下边界坐标
y_start, y_end = 200, 300
spectral_region = img_rgb[y_start:y_end, :, :]

# 计算每一列的RGB通道平均强度
r_intensity = np.mean(spectral_region[:, :, 0], axis=0)
g_intensity = np.mean(spectral_region[:, :, 1], axis=0)
b_intensity = np.mean(spectral_region[:, :, 2], axis=0)

2. 波长校准

光栅衍射的像素位置与波长并非线性关系,需用已知特征波长点建立映射:

# 示例:已知3个特征波长对应的像素位置(需自行替换为实际测量值)
pixel_positions = np.array([100, 300, 500])
known_wavelengths = np.array([435.8, 546.1, 579.1])

# 二次多项式拟合像素-波长映射关系
poly_coeffs = np.polyfit(pixel_positions, known_wavelengths, 2)
wavelengths = np.polyval(poly_coeffs, np.arange(len(r_intensity)))

3. 归一化与绘制灵敏度曲线

将各通道强度归一化后绘制曲线:

# 归一化处理(按各通道最大强度缩放至0-1范围)
r_normalized = r_intensity / np.max(r_intensity)
g_normalized = g_intensity / np.max(g_intensity)
b_normalized = b_intensity / np.max(b_intensity)

# 绘制曲线
plt.figure(figsize=(10, 6))
plt.plot(wavelengths, r_normalized, color='red', label='Red Channel')
plt.plot(wavelengths, g_normalized, color='green', label='Green Channel')
plt.plot(wavelengths, b_normalized, color='blue', label='Blue Channel')

plt.xlabel('Wavelength (nm)')
plt.ylabel('Normalized Sensitivity')
plt.title('Camera RGB Sensor Normalized Sensitivity')
plt.legend()
plt.grid(True)
plt.show()

关键注意事项

  • 光谱区域裁剪:需精准框选仅包含光谱的区域,避免背景噪声干扰强度计算。
  • 校准精度提升:使用更多已知特征波长点(如汞-氩灯的多组特征峰)可提高拟合精度。
  • 噪声处理:若图像噪声较大,可先对光谱区域执行高斯模糊(cv2.GaussianBlur)再计算平均强度。

内容的提问来源于stack exchange,提问作者pchi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:22:39