高光谱图像(Hyperspectral Imaging, HSI)在农业、遥感、医学等领域有广泛应用。本文分享一个基于Python的实用工具,能够将普通RGB图像转换为模拟高光谱图像,并进一步生成增强的彩色可见图像。代码支持批量处理,适合用于数据增强或高光谱分析的实验场景。
一、代码功能概述
-
输入:普通RGB图像(如植物病害数据集)。
-
输出:
-
模拟生成的高光谱图像(多波段)。
-
增强后的彩色可见图像(RGB)。
-
-
适用场景:
-
数据增强:为深度学习模型生成更多样化的训练数据。
-
高光谱分析:模拟真实高光谱相机的成像效果。
-
二、代码结构解析
以下为核心代码模块的详细说明:
1. 生成高光谱图像:create_color_hyperspectral_image
该函数的主要目标是将一张普通的 RGB 图像转换为包含多个波段的高光谱图像。主要步骤如下:
- 图像通道分离:利用
cv2.split
将输入图像分离为 R、G、B 三个单独的通道。 - 高斯滤波:对于每个波段,随机生成不同的高斯核(核大小和标准差均随机),分别对 R、G、B 通道进行滤波处理。这一步模拟了不同波段的光谱响应。
- 通道加权组合:根据当前波段的位置,采用余弦函数计算权重,将三个通道滤波后的结果进行加权组合,形成该波段的数值。
- 噪声添加与归一化:为增强图像真实感,向组合后的数据中添加轻微噪声,最后归一化至 0~255 范围,确保数据类型为
uint8
。
部分代码示例如下:
def create_color_hyperspectral_image(image, num_bands=10):
height, width = image.shape[:2]
hyperspectral = np.zeros((height, width, num_bands), dtype=np.uint8)
b, g, r = cv2.split(image)
for i in range(num_bands):
kernel_size = random.randint(3, 7)
sigma = random.uniform(0.5, 2.0)
gaussian_kernel = cv2.getGaussianKernel(kernel_size, sigma)
gaussian_kernel = gaussian_kernel @ gaussian_kernel.T
r_filtered = cv2.filter2D(r, -1, gaussian_kernel)
g_filtered = cv2.filter2D(g, -1, gaussian_kernel)
b_filtered = cv2.filter2D(b, -1, gaussian_kernel)
weight_r = np.cos(i * np.pi / num_bands)
weight_g = np.cos((i - num_bands / 3) * np.pi / num_bands)
weight_b = np.cos((i - 2 * num_bands / 3) * np.pi / num_bands)
combined = (r_filtered * weight_r + g_filtered * weight_g + b_filtered * weight_b) / 3
noise = np.random.normal(0, 2, combined.shape)
band = combined + noise
band = np.clip(band, 0, 255).astype(np.uint8)
hyperspectral[:, :, i] = band
return hyperspectral
通过以上步骤,我们可以生成一幅包含多个光谱波段信息的图像。
2. 转换为增强可见图像:convert_to_color_visible_image
生成的高光谱图像本身不易直接观察。为了直观展示图像细节,程序通过对特定波段的组合,生成了一幅增强的 RGB 彩色图像。具体步骤包括:
- 波段组合:程序对高光谱图像的不同波段进行加权组合,分别映射到 RGB 三个通道。比如,R 通道由第 0 和第 3 波段的加权结果构成。
- 对比度增强:使用
cv2.convertScaleAbs
方法对组合后的 RGB 图像进行对比度和亮度的调整,使图像更加清晰和明亮。
示例代码如下:
def convert_to_color_visible_image(hyperspectral_img):
rgb_image = np.zeros((hyperspectral_img.shape[0], hyperspectral_img.shape[1], 3), dtype=np.uint8)
rgb_image[:, :, 0] = hyperspectral_img[:, :, 0] * 0.7 + hyperspectral_img[:, :, 3] * 0.3 # R通道
rgb_image[:, :, 1] = hyperspectral_img[:, :, 4] * 0.6 + hyperspectral_img[:, :, 5] * 0.4 # G通道
rgb_image[:, :, 2] = hyperspectral_img[:, :, 7] * 0.5 + hyperspectral_img[:, :, 8] * 0.5 # B通道
rgb_image = cv2.convertScaleAbs(rgb_image, alpha=1.1, beta=5)
return rgb_image
通过该函数,我们能直观地看到高光谱图像经过波段组合后所得到的彩色图像效果。
3. 批量处理图像:process_images
为了适应大规模数据的需求,程序设计了 process_images
函数,实现了对指定文件夹中所有 JPEG 格式图像的批量处理。主要流程包括:
- 目录遍历与文件读取:利用
os.walk
遍历输入文件夹中的所有文件,并对符合条件(后缀为 .jpg)的图像进行处理。 - 图像处理:先调用
create_color_hyperspectral_image
生成高光谱图像,再调用convert_to_color_visible_image
生成增强后的 RGB 图像。 - 图像保存与日志记录:将处理后的图像以 PNG 格式保存到输出文件夹,并记录处理成功和失败的文件数量,方便后续统计和调试。
主要代码段如下:
def process_images():
input_folder = r'D:\python_text\Hyperspectral Image\data\Plant_leave_diseases_dataset_with_augmentation'
output_folder = r'D:\python_text\Hyperspectral Image\data\Images2'
if not os.path.exists(input_folder):
print(f"错误:输入文件夹不存在:{input_folder}")
return
os.makedirs(output_folder, exist_ok=True)
print(f"输出文件夹已创建:{output_folder}")
total_processed = 0
errors = 0
for root, dirs, files in os.walk(input_folder):
rel_path = os.path.relpath(root, input_folder)
curr_output_folder = output_folder if rel_path == '.' else os.path.join(output_folder, rel_path)
os.makedirs(curr_output_folder, exist_ok=True)
for filename in files:
if filename.lower().endswith('.jpg'):
try:
input_path = os.path.join(root, filename)
print(f"正在读取:{input_path}")
img = cv2.imread(input_path)
if img is None:
print(f"无法读取图像:{input_path}")
continue
hyperspectral_img = create_color_hyperspectral_image(img)
visible_img = convert_to_color_visible_image(hyperspectral_img)
base_name = os.path.splitext(filename)[0]
output_path = os.path.join(curr_output_folder, f'hyperspectral_{base_name}.png')
cv2.imwrite(output_path, visible_img)
print(f"已保存:{output_path}")
total_processed += 1
if total_processed % 100 == 0:
print(f"已处理 {total_processed} 个文件...")
except Exception as e:
print(f"处理 {filename} 时出错:{str(e)}")
errors += 1
print("\n处理完成!")
print(f"成功处理文件数:{total_processed}")
print(f"处理失败文件数:{errors}")
print(f"输出文件夹位置:{output_folder}")
通过以上代码,我们可以实现对海量图像数据的自动化处理,极大地提升工作效率。
三、实际应用案例
以植物病害数据集为例,生成的高光谱图像可用于:
-
病害检测:通过多波段信息识别叶片病斑。
-
数据增强:为训练CNN、Transformer等模型提供更多样本。
四、使用说明
-
环境配置:
pip install opencv-python numpy
-
修改路径:
-
设置
input_folder
和output_folder
为本地路径。
-
-
运行代码:
python main3.py
五、总结与改进方向
-
核心价值:低成本模拟高光谱数据,助力小样本学习。
-
优化建议:
-
调整波段数(
num_bands
)和滤波参数,适配不同场景。 -
结合深度学习模型(如HybridSN)进行端到端训练。
-
-
注意事项:
-
确保输入图像路径正确,避免中文或特殊字符。
-
当前代码仅处理 JPEG 格式的图像,可根据需求修改支持更多格式。
-
高斯滤波器的参数(核大小和标准差)、各通道的加权系数及噪声参数都可以根据具体应用场景进行调整,以获得最佳效果。
-
建议在 Python 环境中使用 OpenCV 和 NumPy 库,确保依赖项均已正确安装。
-
完整代码链接如下,欢迎下载测试!如有问题或改进建议,欢迎在评论区交流讨论! 🚀
通过网盘分享的文件:main3.py
链接: https://pan.baidu.com/s/1fHWNbzGqG4DQZWUHPYMbog?pwd=qa83 提取码: qa83
关键词:高光谱图像、Python、OpenCV、数据增强、深度学习