1. 前言
前两天老板突然给了一幅图像数据, 让我提取出其中的交点信息, 图片是这样的:
由于图像数据实在太大,就传了一张截图上来~~
2. 处理思路
2.1 基本需求
我们的需求实际上就是, 提取图像中黑色线段相交的部分(简单来说就是相交的点)
2.2 基本思路
检测图像中的黑色直线部分, 根据hough变换提取出相应的直线方程, 根据直线方程求出他们的交点, 即为我们所需要的点。由于处理的时候, 存在一定误差, 所以一般可以分为两个步骤, 先粗略的寻找一个交点, 然后对他的周围进行搜素即可。
2.3 基本流程
2.3.1 降采样
由于图像数据太大, 处理起来特别占用内存空间, 这里对他进行降采样处理,但是图像整体的形貌还是保持不变
2.3.2 二值化处理
因为我们需要提取的是板块交接处的黑线, 这部分的灰度值和其他部分的差别是比较明显的, 因而我们可以找到一个阈值, 将这部分分离出来,效果如下:
2.3.3 canny 检测边缘
在进行直线检测之前, 我们需要对图像进行边缘检测, 获取图像边缘数据, canny 检测的相关资料: http://blog.csdn.net/luoru/article/details/49022695
https://zh.wikipedia.org/wiki/Canny%E7%AE%97%E5%AD%90
2.3.4 hough变换检测直线
在对图像进行边缘提取之后, 我们可以使用累计概率版本的hough变换获取图像中的直线数据
2.3.5 直线合并
我们看到通过hough变换得到的直线的数量是非常多的,从物理角度我们可以认为相互贴合的直线实际上是一条
2.3.6 求直线的交点
对我们提取得到的直线数据两两求他们的交点
2.3.7 合并相近的交点
可以非常容易的发现, 空间中间隔非常近的点, 在物理空间中实际上是一个点
2.3.8 初始匹配结果
2.3.9 ROI 区域操作 (以第一个ROI区域为例)
2.3.9.1 ROI
2.3.9.2 二值化
2.3.9.3 边缘检测
2.3.9.4 直线检测
2.3.9.5 直线去重
2.3.9.6 交点数据
2.3.9.7 交点去重
2.3.10 实现效果
3. 工程地址
https://code.csdn.net/zhyh1435589631/picture_handle_tianwentai/tree/master
4. 遇到的一些问题及参考资料
- http://blog.csdn.net/luoru/article/details/49022695 canny 算子的原理,可以简单理解为是双阈值滤波,高阈值(伪边缘少, 边缘间断明显), 低阈值(伪边缘多, 边缘比较连续)
- http://blog.csdn.net/chinabinlang/article/details/6802686 atan函数与atan2函数的一点区别, 在求直线的变换角度的时候, 采用atan2 效果更好
- http://www.cnblogs.com/mikewolf2002/p/3454760.html opencv 中svd 的使用, 需要注意的是 opencv 和 matlab svd 得到的结果并不是一样的
- http://www.tuicool.com/articles/IvEBba 图像细化, 虽然最后没有用到
- http://blog.csdn.net/liyuanbhu/article/details/50193947 opencv 直线拟合函数
- http://blog.csdn.net/column/details/opencv-tutorial.html 毛星云的 opencv3 写代码的时候翻翻非常有用呢
时间: 2024-10-08 10:04:32