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区域的代码