通过 openCV 创建矩形蒙版的更好方法

Posted

技术标签:

【中文标题】通过 openCV 创建矩形蒙版的更好方法【英文标题】:Better ways to create a rectangular mask by openCV 【发布时间】:2013-08-08 20:54:26 【问题描述】:

在 openCV 中创建蒙版

      /** result I want
          0 0 0 0 0 0 0 0
          0 0 0 0 0 0 0 0
          0 0 1 1 1 1 0 0
          0 0 1 1 1 1 0 0
          0 0 1 1 1 1 0 0
          0 0 1 1 1 1 0 0
          0 0 0 0 0 0 0 0
          0 0 0 0 0 0 0 0
      */    
cv::Mat mask = cv::Mat::zeros(8, 8, CV_8U);
std::cout<<"before : \n"<<mask<<std::endl;
for(int i = 2; i != 6; ++i)

     auto ptr = mask.ptr<uchar>(i) + 2;
     for(int j = 0; j != 4; ++j)
     
         *ptr++ = 1;
     

std::cout<<"after : \n"<<mask<<std::endl;   

openCV 是否为我们提供了任何内置函数来创建这样的掩码? 为这个任务创建一个函数很简单,但是 openCV 的函数 总是比天真的手工代码快

【问题讨论】:

【参考方案1】:

当然,有一个更简单的方法,使用 roi 运算符:

cv::Mat mask = cv::Mat::zeros(8, 8, CV_8U); // all 0
mask(Rect(2,2,4,4)) = 1;

完成!

【讨论】:

对于那些想要可视化掩码的人,最好将值设置为255而不是1,前提是掩码仅用作布尔掩码。【参考方案2】:

如果有人正在寻找创建一个非矩形蒙版,然后将其应用到图像上,那么请看这里:

Mat& obtainIregularROI(Mat& origImag, Point2f topLeft, Point2f topRight, Point2f botLeft, Point2f botRight)

        static Mat black(origImag.rows, origImag.cols, origImag.type(), cv::Scalar::all(0));
        Mat mask(origImag.rows, origImag.cols, CV_8UC1, cv::Scalar(0));
        vector< vector<Point> >  co_ordinates;
        co_ordinates.push_back(vector<Point>());
        co_ordinates[0].push_back(topLeft);
        co_ordinates[0].push_back(botLeft);
        co_ordinates[0].push_back(botRight);
        co_ordinates[0].push_back(topRight);
        drawContours( mask,co_ordinates,0, Scalar(255),CV_FILLED, 8 );

        origImag.copyTo(black,mask);
        return black;
    

“黑色”是我们将通过从原始图像中裁剪掉不规则的 ROI 最终获得结果的图像。

 static Mat black(origImag.rows, origImag.cols, origImag.type(), cv::Scalar::all(0));

“掩码”是一个 Mat,初始化为与原始图像相同的大小并填充为 0。 Mat mask(origImag.rows, origImag.cols, CV_8UC1, cv::Scalar(0));

把坐标放在ANTICLOCKWISE方向

    vector< vector<Point> >  co_ordinates;
    co_ordinates.push_back(vector<Point>());
    co_ordinates[0].push_back(topLeft);
    co_ordinates[0].push_back(botLeft);
    co_ordinates[0].push_back(botRight);
    co_ordinates[0].push_back(topRight);

现在实际生成掩码

drawContours( mask,co_ordinates,0, Scalar(255),CV_FILLED, 8 );

最后从原始图像(origImag)复制蒙版部分/ ROI,并将原始图像(使用蒙版)的ROI部分粘贴到名为“黑色”的图像中

origImag.copyTo(black,mask);

【讨论】:

以上是关于通过 openCV 创建矩形蒙版的更好方法的主要内容,如果未能解决你的问题,请参考以下文章

使用python为非矩形图像添加羽毛效果

阴影不适用于带有蒙版的 UIViewLayer

5-20 将一个图层作为另一个图层的蒙版

AE插件Saber

OpenCV-Python实战——直方图详解(❤️含大量实例,建议收藏❤️)

Keras `ImageDataGenerator` 图像和蒙版的增强方式不同