兴趣区域(ROI)标注#
1. 普通相片的ROI标注#
使用 LabelMe 来进行普通照片的标注,请参考 releases 来下载可执行的文件。
示例图片#
示例图片长这样,然后可以通过右键-> 图片另存为或左键单击进行下载
数据标注#
在标注之前,记得要先 取消 勾选 保存图像数据
这个选项,不然软件会把所有的图像数据转换成字符串保存到生成的json标注文件内,然后把文件大小从1kb膨胀到至少5MB以上(根据原始图像大小而定),除非特地为了分享标注数据时免去共享原始图片。
然后按照下面的动图来标注ROI的关键边界点
之后软件会保存如下标注结果:
{
"version": "4.5.6",
"flags": {},
"shapes": [
{
"label": "1",
"points": [
[
2447.239263803681,
1369.325153374233
],
[
2469.9386503067485,
1628.2208588957053
],
[
2730.0613496932515,
1605.5214723926379
],
[
2703.0674846625766,
1348.4662576687115
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
}
],
"imagePath": "labelme_demo_img.JPG",
"imageData": null,
"imageHeight": 3456,
"imageWidth": 4608
}
生成的Json文件也可以从这里直接 下载
标注读入#
Json文件可以通过下面的方法来导入:
>>> import easyidp as idp
>>> roi = idp.ROI("path/to/lableme.json")
>>> roi[0]
[[2447.2392638 1369.32515337]
[2469.93865031 1628.2208589 ]
[2730.06134969 1605.52147239]
[2703.06748466 1348.46625767]]
当然,用户也可以选取其他可以显示鼠标悬停坐标的软件,然后直接把坐标值记录在代码里,如下:
>>> import numpy as np
>>> poly = np.asarray([
[1065, 1875],
[...],
[...], ])
>>> roi = idp.ROI()
>>> roi[0] = poly
2. 点云的ROI标注#
一个开源的软件 CloudCompare 被用来标注点云的ROI并且把点保存为txt格式。用户也可以选择其他能够获取点坐标的3D软件,并且把点 x,y,z
保存为 *.txt
文件。
ROI标注#
下面的动图展示了获取txt文件的步骤,通过使用 多点选取
工具来选点并在保存时选择保存为 x,y,z
格式
注意
建议每个ROI单独保存为一个TXT文件,这有助于后续的文件管理。除非用户有进阶的Python数据处理基础,能够处理所有的ROI混合在一个文件中的情况。
标注读入#
生成的TXT文件如下所示,包含了四个顶点的XYZ坐标
7.876980304718,-6.117620944977,-0.568696975708
8.262033462524,-8.053977966309,-0.585714340210
10.198881149292,-7.656465530396,-0.626638412476
9.816680908203,-5.730380535126,-0.562286376953
上面的文件可以直接被EasyIDP读取
>>> import easyidp as idp
>>> test_data = idp.roi.read_cc_txt(r'picking_list.txt')
>>> test_data
array([[ 7.8769803 , -6.11762094, -0.56869698],
[ 8.26203346, -8.05397797, -0.58571434],
[10.19888115, -7.65646553, -0.62663841],
[ 9.81668091, -5.73038054, -0.56228638],
[ 7.8769803 , -6.11762094, -0.56869698]])
提示
原文件只有4个点
>>> test_data = np.loadtxt(r'picking_list.txt', delimiter=',')
>>> test_data
array([[ 7.8769803 , -6.11762094, -0.56869698],
[ 8.26203346, -8.05397797, -0.58571434],
[10.19888115, -7.65646553, -0.62663841],
[ 9.81668091, -5.73038054, -0.56228638]])
但是,根据多边形的定义,起始点和终止点应该是一样的。所以EasyIDP自动把起始点添加到了末尾。
由于每个txt文件只包含一个多边形顶点,目前还需要用户按下面的方法手动创建 ROI
对象:
>>> roi = idp.ROI()
>>> roi["pickling_list"] = test_data
待处理
EasyIDP之后可能会提供API来一次性加载某个文件夹下的所有txt文件作为一个 ROI
对象。
3. 地图上面的ROI标注#
开源的 QGIS 软件被用来制作正射图和地形图标注的Shp文件。用户也可以使用其他可以生成标准Shp文件的GIS软件来达到这个目的。示例用的地图可以从 [这里下载]
添加多边形#
首先,需要把地图载入进来
然后激活 数字化工具栏(digitizing toolbar)
如果之前没有激活的话(在 view -> toolbars
里
然后点击 数据源管理工具(Data Source Manager Toolbar)
里面的 新形状文件图层(new shapefile layer)
,指定shp文件的路径和文件名,把几何类型改为 多边形(polygon)
,然后投影系统改为 跟随系统
(即刚刚导入的地图投影系统),增加一个叫 label
的文字字段(也可以删掉之前自带的 id
字段),点击确定。
点击 数字化工具栏(Digitizing toolbar)
中的 切换编辑(Toggle Editing)
按钮开启shp编辑模式,然后点击 增加多边形特征(add polygon feature)
按钮,鼠标此时会变成准星,然后点击ROI的几个定点后,用鼠标右键来结束编辑,并填上该roi的标签
重复以上步骤,直到地图中所有的ROI都被标上了
如何移动或复制ROI
激活 高级数字化工具栏(Advanced digitizing toolbar)
和 属性工具栏(Attributes toolbar)
如果之前没有激活的话(在 view -> toolbars
里)
点击 属性工具(Attributes toolbar)
里面的 用区域或单点选择形状(Select feature by area or single click)
按钮,选中的形状的顶点会变成红叉;点击 高级数字化工具栏(advanced digitizing toolbar)
里面的 复制和移动形状(copy and move feature)
按钮,旁边的下拉菜单提供移动和复制的转换
如何制作特定形状的ROI
激活 形状数字化工具栏(Shape digitizing toolbar)
如果之前没有激活的话(在 view -> toolbars
里)
提供了创建更高级的圆弧、圆、椭圆、矩形(直角)和常规多边形的工具
导入shp文件#
在这个示例里,plots.shp
用的是默认的经纬度坐标系统
>>> import easyidp as idp
>>> roi = idp.ROI()
>>> roi.read_shp(r'roi/plots.shp', name_field=0)
>>> roi.crs.name
"WGS 84"
>>> roi["N1W2"]
array([[ 35.73473289, 139.54053488],
[ 35.73473691, 139.54055632],
[ 35.73471937, 139.54056118],
[ 35.73471541, 139.54053963],
[ 35.73473289, 139.54053488]])
待处理
shp文件仅仅能提供二维坐标,但是三维的地理空间坐标在后续的计算中也是很有用的。而DSM恰好可以提供高度值,因此整合两个文件到一起获取三维坐标是可行的。更详细的信息,可以参考 欢迎查阅EasyIDP官方文档