C++ OpenCV实战之网孔检测的实现

2022-05-06 16:05:07
目录
前言
一、HSV通道转换
二、图像修复
2.1 OpenCV函数实现
2.2 MyFunction
三、轮廓提取
四、效果显示
五、源码
总结

前言

前段时间,有位粉丝私信我,给我发了一张图片,如下图所示:

C++ OpenCV实战之网孔检测的实现

在这里贴出他的原话。

C++ OpenCV实战之网孔检测的实现

从他给的图片分析,该图存在遮挡,所以不能简单的二值化,然后提取图像轮廓去寻找结果。所以,我就想如何去掉这些遮挡物(即图像修复)。从图像可知,该遮挡物是黄色的线,所以,我就想可否使用hsv色彩空间提取出黄色,然后得到二值掩模图像,最后对原图进行修复。接下来,就一起看看是如何一步步实现的吧。

一、HSV通道转换

通过hsv通道转换,可以提取出图像中的黄色分量。

>结果如图所示:

C++ OpenCV实战之网孔检测的实现

二、图像修复

关于图像修复的相关知识可以参考我之前的博文。这里就不细说了。

OpenCV>

OpenCV C++案例实战十七《图像去水印》

我们拿到上面的mask掩模图像,需要对其进行膨胀处理,使修复区域范围扩大。

//将生成的掩膜mask膨胀一下,使掩膜区域放大 Mat kernel = getStructuringElement(MORPH_RECT, Size(9, 9)); dilate(mask, mask, kernel);

C++ OpenCV实战之网孔检测的实现

接下来,需要对图像进行修复。这里我提供两种修复方法,一种是OpenCV提供的inpaint函数,一种是我自己写的。

2.1> //使用OpenCV自带的inpaint函数进行图像修复,得到目标图像 Mat inpaintImg; inpaint(src, mask, inpaintImg, 1, INPAINT_NS);

C++ OpenCV实战之网孔检测的实现

效果如图所示。

2.2>

通过修改图像像素达到图像修复的效果。具体请看源码注释。

//自己写的算法,修改图像像素,完成图像修复 Mat canvas = Mat::zeros(src.size(), src.type()); int r = 1;//像素查找范围--表示在该像素点上下几行像素进行查找 for (int i = r; i < src.rows- r; i++) { for (int j = 0; j < src.cols; j++) { if (mask.at<uchar>(i, j) != 255) { bQDrY //对于非掩膜区域,直接将原像素进行像素赋值 for (int c = 0; c < 3; c++) { canvas.at<Vec3b>(i, j)[c] = src.at<Vec3b>(i, j)[c]; } } else { //找到距离该掩膜像素点最近的非掩膜区域像素进行赋值 Point res = find_Nearest_Point(mask, i, j, r); for (int c = 0; c < 3; c++) { canvas.at<Vec3b>(i, j)[c] = src.at<Vec3b>(res.x, res.y)[c]; } } } }

C++ OpenCV实战之网孔检测的实现

效果如何所示

三、轮廓提取

接下来我们只需要对修复之后的图像进行轮廓提取就可以了。

>

四、效果显示

>C++ OpenCV实战之网孔检测的实现

如图为该案例最终效果。

五、源码

#include<opencv2/opencv.hpp> #include>

总结

本文使用OpenCV>

1、hsv通道转换,提取出黄色分量,得到掩模图像。

2、利用掩模图像对原图进行图像修复。

3、通过轮廓提取定位网孔位置。

以上就是C++ OpenCV实战之网孔检测的实现的详细内容,更多关于C++ OpenCV网孔检测的资料请关注我们其它相关文章!