1 具体步骤
制作深度学习所需的标签,除了使用labelme,还可以利用ENVI中的ROI工具。具体方法如下:
1. 打开ENVI 5.3,加载一幅影像,然后在上方工具栏点击“roi按钮”。
2. 新建一类兴趣区。如果要制作树木的标签,就在图上标注树木区域。
3. 标注完后,在toolbox中依次点击Regions of Interest >> Classification Image from ROIs,将绘制好的兴趣区先保存为Memory。
4. 依次点击File >> Save as , 选择memory, 将其保存为tif格式。
5. 输出成功。打开''Quick Stats",可以看到输出的是0-1二值图像。
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)