图像编辑器 Monica 之简单 CV 算法的快速调参

一. 图像编辑器 Monica

Monica 是一款跨平台的桌面图像编辑软件(早期主要是个人为了验证一些算法而产生的)。

7260fd3b958cc02e03a69f84d11b52a8.jpeg
screenshot.png

其技术栈如下:

  • Kotlin 编写 UI(使用 Compose Desktop 作为 UI 框架)

  • 部分算法使用 Kotlin 实现

  • 基于 mvvm 架构,使用 koin 作为依赖注入框架

  • 使用 JDK 17 进行编译

  • 其余的算法使用 OpenCV C++ 来实现,Kotlin 通过 jni 来调用。

  • 深度学习的模型主要使用 ONNXRuntime 进行部署和推理

  • 少部分模型使用 OpenCV DNN 进行部署和推理。

Monica 目前还处于开发阶段,当前版本的可以参见 github 地址:https://github.com/fengzhizi715/Monica

二. 实验性的功能——为简单的 CV 算法提供快速调参的能力

由于工作原因,我时常需要写一些 CV 的算法,也时常会为了某个算法而不断地调参。有时也厌烦枯燥的调参,所以在 Monica 中做了这个模块。前期主要是方便自己能够对一些简单的算法快速调参,后续希望它也可以帮助到别人。

下面展示该模块的入口6318a4e5da5a4a9b28be947801046b7d.jpeg

以及该模块的首页22ab2bd4bc7a099b7b98876df7e386cc.jpeg

目前我只规划了二值化、边缘检测、轮廓分析、图像卷积、形态学操作、模版匹配等功能,并实现了其中几个。

2.1 二值化

Monica 提供了全局阈值分割、自适应阈值分割、Canny 边缘检测以及通过 OpenCV 的 inRange() 函数进行彩色图像分割来实现二值化。这些都是比较常见的二值化的方法。

下面加载的图片是我工作中经常遇到的,并需要做图像处理的,所以以下图为例a3bcac3405bdd7a851110472f78a8ccf.jpeg

通过全局阈值分割实现二值化,就可以看到手机的轮廓。3bc5858500e357a705568019b6cc20d3.jpeg

下图是为了展示 Canny 边缘检测3d534a6e2e1a03eacde63c3355a49f5d.jpeg

通过 Canny 边缘检测实现二值化。c87dd5adb0107d58ae009e2446605b10.jpeg

下图是为了展示彩色图像分割98600a1e33b6b70853bd95bb1201d2d9.jpeg

图像通过色彩空间转换,在 OpenCV 中将图像从 BGR 转换成 HSV,然后再用 inRange() 进行颜色分割实现二值化。对于该二值化的图像,后续还要再进行一些形态学的操作,才有助于进一步的轮廓分析。

345473fb2f4ac6ac1faec60643869eda.jpeg
通过彩色图像分割实现二值化.png

2.2 边缘检测

图像的边缘是图像中亮度变化比较大的点。Monica 提供了常见的边缘检测算子。

4e4f76fba5124187c69cf849055b9ce3.jpeg
边缘检测算子.png

下面以 Laplace 算子为例,实现边缘检测。c4f4aef1ca70ceaf87724c1a6e23bf1d.jpeg

2.3 轮廓分析

图像的轮廓是指图像中具有相同颜色或灰度值的连续点的曲线。轮廓边缘是有联系的,边缘是轮廓的基础,轮廓是边缘的连续集合。轮廓分析呢,简而言之就是找到图像中物体的轮廓。

下图以回形针为例,查找图中回形针的轮廓。

cb74c7025f3b3bbd0aa70152b768e4a6.jpeg
加载回形针图片.png

首先对图像进行二值化。43e39ea9ac7a539f6286c7b5b5855fa4.jpeg

然后对二值图像进行轮廓查找,并将轮廓的外接矩形、最小外接矩形、质心显示到原图中。c471cd7d8ee2a3f1fb574f4c13243fcc.jpeg

有时为了找个某些轮廓,需要对所有轮廓进行过滤。目前支持通过周长、面积、圆度、长宽比这些设置来过滤轮廓。404327a7d783004f452660d93f230671.jpeg

三. 功能的实现

该模块功能的实现,主要是封装 OpenCV 各个函数的调用,其实是蛮简单的。

不过有一些需要注意比如:

  • jni 层调用 OpenCV 函数实现二值化后,生成的二值图像如何在应用层展示?

  • 应用层需要处理的二值图像(BufferedImage.TYPE_BYTE_BINARY),通过 byte array 如何由 jni 转换成 OpenCV 的 Mat 对象?

下面以调用 canny 函数和轮廓分析为例,简单进行说明。<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值