OpenCvSharp用掩膜来实现圆形的ROI区域

Posted x1angzeeD.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCvSharp用掩膜来实现圆形的ROI区域相关的知识,希望对你有一定的参考价值。

首先我有一个问题:opencv有没有一个类似于Rect的这么一个圆的框架,就像下面这段代码能直接从原图上裁剪下来一个圆形的ROI(ROI图片是一个圆),而不是像本文介绍的这样用掩膜遮掉不感兴趣区域(ROI图片大小和原图一样)?有知道的大牛评论分享一下,欢迎讨论

Rect tmp_Rect = new Rect(Math.Min(X0, X1), Math.Min(Y0, Y1), Math.Abs(X0 - X1), Math.Abs(Y0 - Y1));
roiImg = new Mat(srcImg, tmp_Rect);

 

好了,那么言归正传:(完整代码我就不贴出了,步骤很简单,很清晰)

步骤:读图 ⋙ 画ROI/霍夫变换识别圆 ⋙ 创建一个掩膜并将圆按原位置画在掩膜上 ⋙ 对掩膜水漫填充 ⋙ 生成原图与掩膜结合的图片

你可以利用霍夫变换识别图中的圆形区域CircleSegment[] cs = Cv2.HoughCircles(roiClone, HoughMethods.Gradient, 1, 80, 70, 100, 100, 200);

    或者你利用Cv2.Circle(……)手动画一个圆形区域,将圆形的中点Point seed记录下来(这个点水漫填充时会用到,即水漫填充算法的起始点)

接着就是创建掩膜,所谓的掩膜说白了:就是创建一个和原图大小一致的这么一个空容器Mat mask = Mat.Zeros(OrgMatClone.Size(), MatType.CV_8U);   

然后,再利用水漫填充将感兴趣区域填充起来 Cv2.FloodFill(mask, seed, new Scalar(255));

最后,srcImg.CopyTo(resMat, mask);    注:srcImg是原图片,resMat是原图与掩膜结合之后的结果图

 

“其他形状的ROI也是同样的道理,思路也是这样的思路就是第一步不同”

画任意形状的ROI你可以参考这篇博客我是超级链接哦

 

最后:效果图如下

 

当然,还没结束

我们可以利用Cv2.FindContours(……)来这样处理:

你有没有发现这个算子的第三个参数是啥,所以就可以这样:

就得到这样的效果:(左:原图 、右上:处理后的圆形ROI、右下:原矩形ROI)

以上是关于OpenCvSharp用掩膜来实现圆形的ROI区域的主要内容,如果未能解决你的问题,请参考以下文章

高光谱遥感图像处理-----ENVI矢量做ROI 用来裁剪掩膜

OpenCV-C++选择提取感兴趣区域(ROI区域)附用鼠标选取ROI区域的代码

极智AI | 图像处理中对掩膜 mask 和 ROI 的理解

Mil学习之显示鼠标交互交互绘图交互Mask

Mil学习之图片的ROI获取及半透膜掩膜效果着色

详解掩膜mask