使用ENVI的ROI工具绘制深度学习标签

1 具体步骤

       制作深度学习所需的标签,除了使用labelme,还可以利用ENVI中的ROI工具。具体方法如下:

1.  打开ENVI 5.3,加载一幅影像,然后在上方工具栏点击“roi按钮”。

6af25a81471c4c2bb8cb820eb679672d.png

d2fcc66381024f0495389b37198ec174.png

2. 新建一类兴趣区。如果要制作树木的标签,就在图上标注树木区域。

913de59c079546be98085862d8af2e87.png

1ccb34f60cfd407f9b6e9cd9ddd38d5a.png

3. 标注完后,在toolbox中依次点击Regions of Interest >> Classification Image from ROIs,将绘制好的兴趣区先保存为Memory。

01fe819c24b64dc1a7e3898fa8a7f19b.png

e571f9a22f704f4c921d214b1486ff99.png

4. 依次点击File >> Save as , 选择memory, 将其保存为tif格式。

80d3ba5dbec4461485f302498fb66460.png

9d932f6508ac472d86847269e8e4c497.png

c12add6ef42f408da779b3b0f5759dd1.png

5. 输出成功。打开''Quick Stats",可以看到输出的是0-1二值图像。

a482001085bb4fafb46c96ca44f98084.png

84fb1baebe8840d1956dbbe95985c9ae.png

2 一些问题

        使用上面的方法得到的标签,只有在envi、arcgis,以及其他使用GDAL库读取文件的软件或代码里读取,图像的像素值才是类别值(比如0,1,2);如果使用OpenCV库里的imread函数打开,图像的像素值就不是类别值,而是类别对应的颜色值。因此我加上了一个转换的代码,把ENVI得到的标签转换为像素值为类别号的灰度图,前提是需要保存兴趣区的.xml文件。

# -*- coding:utf-8 -*-
"""
@Time: 2023/4/2 21:45
@author: Geoflyme
@file: label_RGBto01.py

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

# 使用envi得到的label, 在py打开是RGB格式的图,不是我们所需的分类值。
# 利用.xml文件,查找每一个类别所对应的色彩值,建立起一个查找表(例如label中色彩值为(0,255,0)的像元属于第2类地物)。
# 利用查找表可以进行转换,将RGB转换为值为类别索引的灰度图。

# 函数:读取.xml文件中的 <Region name = "xxx" color="x,x,x">
def read_xml(path,classes):
    table = np.zeros((classes, 3), dtype=np.int64)
    l = ""
    file = open(path, 'r')
    data = file.readlines()
    classnum = 0
    for i in data:
        if 'Region name' in i :
            classnum = classnum + 1
            l = i
            temp = l.split("\"")[3]
            table[classnum,0] = int(temp.split(",")[0])
            table[classnum,1] = int(temp.split(",")[1])
            table[classnum,2] = int(temp.split(",")[2])
    return(table)


# 分类数(含背景)
classnum = 2
# xml文件路径
xml_path = r'cd10.xml'
# 调用函数求颜色查找表
table = read_xml(xml_path,classnum)
print("table = ", table)

# 读取RGB形式的label
img_path = r'cd10_label.tif'
img = cv2.imread(img_path)[:, :, (2, 1, 0)]
h = img.shape[0]
w = img.shape[1]
# 定义输出图像 单波段灰度图
output = np.zeros((h,w),dtype=np.int64)

# 映射
for i in range(h):
  for j in range(w):
      for k in range(classnum):
           if img[i, j, 0] == table[k, 0] and img[i, j, 1] == table[k, 1] and img[i, j, 2] == table[k, 2]:
                   output[i,j] = k

# 输出图像
ori = img_path.split(".")[0]
cv2.imwrite(ori+"_out.png", output)

 

 

  • 11
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值