m0_67182379 2023-11-07 20:38 采纳率: 54.5%
浏览 236
已结题

ENVI 图像分割 阈值分割 RGB 多光谱

我在处理无人机拍摄的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任务进行阈值分割,并最后将结果中保留的原始植被信息保存为处理后的分类掩膜图像。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月15日
  • 创建了问题 11月7日