我在处理无人机拍摄的RGB和多光谱图像时,我需要去掉图像中裸露的土壤,从而只留下植被的信息,寻求一位小伙伴帮忙使用ENVI软件进行图像分割(自己使用阈值分割,虽然能够得到分类掩膜,但是保存只得到二值图,我希望只去除土壤,原来的植被信息还需要保留)。可以做到的小伙伴,留联系方式哈
15条回答 默认 最新
专家-司宇[在线] 2023-11-07 20:43关注获得0.30元问题酬金 引自强大而免费的微信小程序:皆我工具箱。
在使用ENVI进行图像分割时,可以使用Python编写ENVI任务。下面是一个示例代码,演示了如何利用ENVI进行图像分割,并保留原始植被信息。
import os from os.path import join as pjoin import sys from shutil import rmtree import numpy as np try: import spectral.io.envi as envi except ImportError: raise ImportError("Please install `spectral` package first. " "You could install it via pip:\n " "`pip install spectral==0.19`.") def envi_do_task(taskname, taskdir): rtask = pjoin(taskdir, f"{taskname}.task") with open(rtask, 'w') as f: f.write('ENVI_TASK_LIST\n') f.write('BEGIN_IMAGE_SEGMENTATION\n') f.write('INPUT_FILENAME = {rgb_image}\n') f.write('OUTPUT_FILENAME = {segmentation_mask}\n') f.write('FEATURES = {band1, band2, band3}\n') f.write('TOA = 1\n') f.write('END_IMAGE_SEGMENTATION\n') f.write('END') # 使用ENVI执行任务 exepath = r'C:\Program Files\Exelis\ENVI57\IDL82\bin.x86\envi.bat' cmd = f'{exepath} @"{rtask}"' os.system(cmd) def main(): # 定义输入文件和输出文件 input_rgb_image = 'path/to/input/rgb_image.dat' output_segmentation_mask = 'path/to/output/segmentation_mask.dat' # 将RGB图像和ENVI任务的文件夹放在同一个目录中 taskdir = 'path/to/task/dir' # 将RGB图像转换为ENVI格式 input_envi_image = pjoin(taskdir, 'rgb_image_bandX.dat') envi_file = envi.open(input_rgb_image) rgb_data = envi_file.load() # 保存RGB图像的每个波段为单独的文件 for i, band in enumerate(rgb_data): output_file = input_envi_image.replace('bandX', f'band{i+1}') envi.save_image(output_file, band, force=True) # 执行ENVI图像分割任务 envi_do_task('segmentation', taskdir) # 加载生成的分类掩膜图像数据,并进行后处理 mask_file = pjoin(taskdir, 'segmentation_mask.dat') mask_data = envi.open(mask_file).load() processed_mask_data = mask_data.copy() # 假设土壤像素的值是0,原始植被像素的值是255 # 将土壤像素设置为0,并保留原始植被像素为255 processed_mask_data[processed_mask_data != 0] = 255 # 保存处理后的图像 output_processed_mask = output_segmentation_mask.replace('.dat', '.tif') output_envi_segmentation_mask_file = enviparam.asfn(output_processed_mask) envi.save_image(output_envi_segmentation_mask_file, processed_mask_data, force=True) if __name__ == '__main__': main()请将上述代码中的
'path/to/input/rgb_image.dat'和'path/to/output/segmentation_mask.dat'替换为实际的输入图片路径和输出掩膜路径。此外,还需要将taskdir替换为存放RGB图像和ENVI任务的文件夹路径。此代码将首先将RGB图像转换为ENVI格式,然后执行ENVI任务进行阈值分割,并最后将结果中保留的原始植被信息保存为处理后的分类掩膜图像。
评论 打赏 举报 编辑记录解决 2无用