多区域掩码 OpenCV

Posted

技术标签:

【中文标题】多区域掩码 OpenCV【英文标题】:Multi region mask OpenCV 【发布时间】:2014-11-27 19:30:02 【问题描述】:

我想在 OpenCV 中创建一个包含一些完整矩形区域(比如 1 到 10 个区域)的蒙版。将其视为显示图像上感兴趣特征位置的掩码。我知道每个区域角落的像素坐标。

现在,我首先将 Mat 初始化为 0,然后循环遍历每个元素。使用“if”逻辑,如果它们属于该区域,我将每个像素设置为 255,例如:

for (int i = 0; i<mymask.cols, i++) 
   for (int j = 0; j<mymask.rows, j++) 
      if ( ((i > x_lowbound1) && (i < x_highbound1) &&  
         (j > y_lowbound1) && (j < y_highbound1)) || 
         ((i > x_lowbound2) && (i < x_highbound2) &&  
         (j > y_lowbound2) && (j < y_highbound2))) 
         mymask.at<uchar>(i,j) = 255;
      
   

但这很笨拙,我认为效率低下。在这种情况下,我用 255 “填充”了 2 个矩形区域。但是除了使用 switch-case 并重复代码 n 次之外,没有可行的方法来更改我填充的区域数。

有没有人在想更聪明的事情?我宁愿不使用第 3 方的东西(除了 OpenCV ;)),我正在使用 VisualStudio 2012。

【问题讨论】:

mymask.at&lt;i*mymask.rows + j&gt; = 255; - 不应该是mymask.at&lt;some_type&gt;(j,i) = 255; 吗? 是的,当我写这个问题时,我无法访问我的代码,所以我写了我记得的...... 好吧,“是的,可能”我的意思是你完全正确;)谢谢,我会纠正它! 【参考方案1】:

使用cv::rectangle():

//bounds are inclusive in this code!
cv::Rect region(x_lowbound1, y_lowbound1,
                x_highbound1 - x_lowbound1 + 1, y_highbound1 - y_lowbound1 + 1)
cv::rectangle(mymask, region, cv::Scalar(255), CV_FILLED);

【讨论】:

谢谢。您是否知道如何轻松调整代码以迭代多个子区域? 您当前如何存储区域?将每个存储为 Rect 可能是有意义的。然后你可以将它们全部放在一个向量(或其他容器)中,然后遍历它,为每个调用 cv::rectangle() 好的,我会这样做的。我担心的是我事先不知道会有多少个矩形(它是用户输入,以及矩形的坐标和尺寸),但我会在一个向量中迭代,它肯定会很好。谢谢!

以上是关于多区域掩码 OpenCV的主要内容,如果未能解决你的问题,请参考以下文章

OSPF多区域设置

OpenCV 校正,图像 C++ 上有太多黑色区域

python基于图像的掩码mask信息获取病灶区域ROI最小外接矩形坐标位置opencv基于掩码最小外接矩形坐标剪裁原图(crop image by mask rectangle)

opencv中如何让白色的区域变成透明背景,然后和别的图片融合???

ROI多区域选择

ROI多区域选择