eCognition(易康)是一款强大的、集成“面向对象影像分类”功能的商用遥感软件。这款软件提供了影像分割、影像特征计算和选择、分类(规则分类和监督分类)和结果输出等功能,并且将整个执行流程以规则集 (rule set) 的形式进行管理和执行。区别于传统的基于像素分类,易康将面状物体 Object 作为认知的基本单位,能够准确提取地物边界,极大地提高了分类精度。其简介如下:
该技术并非孤立地检查像素/点,而是在上下文中进行检查。它以迭代的方式构建图像,而不是将像素组识别为对象。它就像人类大脑一样,利用对象的颜色、形状、纹理和大小以及它们的环境和关系来得出与经验丰富的分析人员相同的结论和推论,但又增加了自动化和标准化的优势。
然而,对个人使用的 Developer 版本而言,批量处理迄今为止都是一个无法解决的难题。试想一下这样一个使用场景:手上有成百上千张影像需要测试,其中一个环节包括了面向对象分割,难道在这个软件里一个个点么?我对此进行了一番探索。
现有的方案
eCognition 既没有像 ArcGIS 提供 arcpy 一样给出附带的 python 包与封装好的函数,也没有在 规则集 中给出批处理相关的工具。我翻遍了内外网的资料,发现目前可行的方案大抵只有以下两种:
1、使用易康官方提供的 AutomationAPI,自行基于 C++ 进行二次开发。我尝试了一下,发现 Automation API所需要的 Microsoft Visual Studio 必须是 2015 版本,我在 2019 版本上使用时就会报错。这个学习成本和调用 arcpy 相比高太多了,我选择放弃。
2、使用 eCognition Server。该服务器组件提供了一个图像分析工作的批量、并行执行环境。然鹅使用这个软件需要钞能力,也不是一个学生能搞得到的。
解决方案
经过多次摸索,我终于找到了一个可行的解决方案。一言以蔽之,就是“让电脑按顺序自动点击”。虽然设置起来有点麻烦,但是与人工相比已经足够快了。批量分割并导出图像的总体流程如下:
其中标蓝色部分的操作分别用两个 python 脚本实现,其余部分在易康软件中设置完成。
1、创建新工作区
首先进入 eCognition Developer 软件,我使用的软件版本为9.0。在进入时选择Rule Set Mode
模式,然后点击左上角的 File > New Workspace
来创建一个新的工作区。
2、导入待分割影像
为了将大量待分割的图像一起导入进工作区,建议将图像按统一命名规则分门别类放置在一个或多个文件夹内,然后使用Customized Import
进行导入。官网对这个“自定义导入”按钮的描述如下:
可见,这个自定义导入功能需要指定一个根文件夹,所有待处理的图像都应在这个根文件夹目录下。它们的命名规则需要用Search String
进行表述。为了测试所写的Search String
是否正确,易康要求给出一个Matser File
的名称进行测试,如果所写的表达式能正确匹配到用于测试的文件,那么便可以愉快导入啦。
对于核心部分的Search String
,它是支持基本的正则符号的,如*
、.
等。此外,易康还给出了一些独有的关键词,它们的含义在下图列了出来,我自己使用了标黄的几个重点词。
3、设置规则集
在本规则集中,我所设定的目标是,对每张图像分别按150、100、50、20、10的 scale 参数进行分割,并将不同分割参数分割后的结果按 tif 格式导出到对应的文件夹下。
首先,点击Process > Process Tree
在右侧打开流程树,然后添加组合所需要的算法。依据我的目标,我只使用了三个算法,分别为:
execute child process
。执行子流程,用于简化后续点击,将其余两个操作多次加入到子流程内,达到“一次点击,全部分割”的功能。multiresolution segmentation
。按对象分割,需要在其中设定 “scale parameter” 这个参数。export thematic raster files
。导出分割结果为栅格。需要按实际需求修改 “Export path”参数,并且保证五个导出算法的 “Export item name” 各不相同。我自己为导出 scale 参数为 100 图像所设置的 Export path 如下,其余类似,可供参考:
{:Workspc.OutputRoot}\results\scale_100\{:Project.Name}.{:Ext}
第 1 至 3 步的部分操作截图如下,全屏观看更清晰:
4、自动化点击
在进行自动化点击前,首先应确定人是如何在软件内点击从而完成任务的。完整的点击流程如下:
- 双击图像,将图像载入到工作区域内;
- 单击流程树中的
do
,按F5
执行所有子流程; - 等待若干秒,直至全部操作完成;
- 按
ctrl+s
保存结果; - 双击下一幅图像,进行循环。
到此为止,点击流程并不复杂。不过需要留意的是,如果需要处理的图像很多,则需要每处理几幅图像便进行翻页,因此便有了第六步:
- 若图像未处理至最后一页,便每处理 3 幅就翻一次页;若图像处理至最后一页,便从头处理到尾。
判断图像是否处理至最后一页的方法也很简单:数数字。计算一下总数量,再计算一下最后一页的数量,相减即可。
代码实现
代码的实现并不复杂,使用 pyautogui
库即可。需要留意的是,由于各个电脑的分辨率以及易康软件内部的布局并不相同,因此使用这个库确认各个按钮位置的过程需要自己配置。配置的方法也很简单,在命令行中打开 python,导入pyautogui
包,键入pyautogui.position()
,然后将鼠标放置在所需点击的按钮上后再按回车。所返回的 x、y 坐标便是所需要的按钮屏幕坐标了。
下面是我按照自己电脑的布局,设计完成的代码。仅供参考,务必按自己布局调整下方与pg.click()
有关的坐标参数!
带有翻页功能的代码:
import pyautogui as pg
import time
for i in range(289): # 待处理图像个数,需要自己数一下
print("count: " + str(i+1))
if i % 3 == 0:
pg.click(x=271, y=163, clicks=2, duration=0.1) # 双击打开目录中第一幅图像
elif i % 3 == 1:
pg.click(x=271, y=187, clicks=2, duration=0.1) # 双击打开目录中第二幅图像
elif i % 3 == 2:
pg.click(x=271, y=212, clicks=2, duration=0.1) # 双击打开目录中第三幅图像
pg.click(x=271, y=237, duration=0.2) # 单击目录中第四幅图像,即翻页后的第一幅
pg.scroll(-200) # 模拟鼠标向下翻页,一次翻过三张图像
# run
pg.click(x=1980, y=136, duration=0.2) # 点击分割按钮
pg.press('f5') # 执行分割流程
time.sleep(7) # 等待执行完成
pg.hotkey('ctrl', 's') # 同时按下 ctrl+s 进行保存
time.sleep(1) # 等待保存完成
处理至最后一页后的代码:
import pyautogui as pg
import time
for i in range(40): # 最后一页需处理的图像个数
print("count: " + str(i+1))
pg.click(x=271, y=237+i*25, clicks=2, duration=0.1) # 依次点下来,y坐标递增
pg.click(x=1980, y=136, duration=0.2)
pg.press('f5')
time.sleep(7)
pg.hotkey('ctrl', 's')
time.sleep(1)
小结
我是偶然了解到pyautogui
这个库的,当时就惊叹于 python 社区的广博。这个强大的库能帮助解决很多问题,带着巧思将其与一些乏味的任务相结合,便能化繁为简,为处理重复而繁琐的工作增添高效与优雅。python 用于解决“批量”处理的问题,易康则用于进行独家的“面向对象分割”,将两者一结合便能极大提升处理效率。本文所实现的“使用易康软件批量按对象分割并导出”仅仅是冰山一角,重要的是这个方法、这个思路可行,能够作为一个方案解决实际问题。
2024年10月4日 21:35
不错不错,我喜欢看 https://www.ea55.com/
2024年10月1日 20:37
想想你的文章写的特别好https://www.237fa.com/
2024年9月23日 08:54
想想你的文章写的特别好https://www.jiwenlaw.com/
2023年03月26日 02:41
表评论7242
2023年03月08日 17:09
您好,文章写的很好,可以转载一下吗?会贴出本文的链接。
2023年03月13日 22:04
可以的。
2023年03月16日 20:53
谢谢
2022年08月14日 22:17
您好 可以加一下你的好友吗?我最近也需要用易康处理大规模的也遥感图像
2022年08月16日 14:39
我的邮箱是 yuxuanye145@gmail.com
2022年03月23日 16:21
感谢灵感支持,gui该库已用于爬取涨潮数据,