兴趣区域(ROI)标注#

1. 普通相片的ROI标注#

使用 LabelMe 来进行普通照片的标注,请参考 releases 来下载可执行的文件。

示例图片#

示例图片长这样,然后可以通过右键-> 图片另存为或左键单击进行下载

labelme_demo_img.JPG

数据标注#

在标注之前,记得要先 取消 勾选 保存图像数据 这个选项,不然软件会把所有的图像数据转换成字符串保存到生成的json标注文件内,然后把文件大小从1kb膨胀到至少5MB以上(根据原始图像大小而定),除非特地为了分享标注数据时免去共享原始图片。

labelme_cancel_save_img_data.png

然后按照下面的动图来标注ROI的关键边界点

labelme_mark.gif

之后软件会保存如下标注结果:

{
    "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
gimp_coord.jpg

2. 点云的ROI标注#

一个开源的软件 CloudCompare 被用来标注点云的ROI并且把点保存为txt格式。用户也可以选择其他能够获取点坐标的3D软件,并且把点 x,y,z 保存为 *.txt 文件。

ROI标注#

下面的动图展示了获取txt文件的步骤,通过使用 多点选取 工具来选点并在保存时选择保存为 x,y,z 格式

cc_mark_txt.gif

注意

建议每个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软件来达到这个目的。示例用的地图可以从 [这里下载]

添加多边形#

首先,需要把地图载入进来

qgis_load_map.png

然后激活 数字化工具栏(digitizing toolbar) 如果之前没有激活的话(在 view -> toolbars

qgis_activate_toolbar.png

然后点击 数据源管理工具(Data Source Manager Toolbar) 里面的 新形状文件图层(new shapefile layer) ,指定shp文件的路径和文件名,把几何类型改为 多边形(polygon) ,然后投影系统改为 跟随系统 (即刚刚导入的地图投影系统),增加一个叫 label 的文字字段(也可以删掉之前自带的 id 字段),点击确定。

qgis_init_shp.gif

点击 数字化工具栏(Digitizing toolbar) 中的 切换编辑(Toggle Editing) 按钮开启shp编辑模式,然后点击 增加多边形特征(add polygon feature) 按钮,鼠标此时会变成准星,然后点击ROI的几个定点后,用鼠标右键来结束编辑,并填上该roi的标签

qgis_add_roi.gif

重复以上步骤,直到地图中所有的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) 按钮,旁边的下拉菜单提供移动和复制的转换

qgis_mv_roi.gif

如何制作特定形状的ROI

激活 形状数字化工具栏(Shape digitizing toolbar) 如果之前没有激活的话(在 view -> toolbars 里)

qgis_adv_roi.gif

提供了创建更高级的圆弧、圆、椭圆、矩形(直角)和常规多边形的工具

导入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官方文档