多区域掩码 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<i*mymask.rows + j> = 255;
- 不应该是mymask.at<some_type>(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的主要内容,如果未能解决你的问题,请参考以下文章
python基于图像的掩码mask信息获取病灶区域ROI最小外接矩形坐标位置opencv基于掩码最小外接矩形坐标剪裁原图(crop image by mask rectangle)