Matlab掩膜
Matlab中poly2mask,定义是将关注区域 (ROI) 多边形转换为区域掩膜,语法为
BW = poly2mask(xi,yi,m,n)
根据顶点位于坐标 xi 和 yi 处的 ROI 多边形,计算大小为 m×n 的二值关注区域 (ROI) 掩膜 BW。如果该多边形不闭合,poly2mask 会自动将其闭合。poly2mask 函数将位于多边形内的像素设置为 1,将位于多边形外的像素设置为 0。
官网将感兴趣的区域 (ROI) 多边形转换为区域掩膜 - MATLAB poly2mask - MathWorks 中国
对该函数做了详细的介绍,包括算法原理。
roipoly底层也是调用的此函数。先上一个示例
img = imread('coins.png');
figure,imshow(img)
[mask,ximask,yimask]=roipoly;%手绘多边形特征点
hold on
plot(ximask,yimask,'bo-','LineWidth',2)%将点绘制在原图上
hold off
figure,imshow(mask)%显示roipoly 生成的掩膜
[m,n] = size(img);
pmask = poly2mask(ximask,yimask,m,n);%poly2mask 生成的掩模
figure,imshow(pmask)
将点留在原图上,用蓝色圆圈连线表示
生成的二值化掩膜,调用roipoly和poly2mask保持一致
Opencv实现多边形掩膜
Opencv可以用cv::fillPoly去实现掩膜功能。
cv::fillPoly的详细说明可以参考博客[C++] opencv - fillPoly(填充多边形)函数介绍和使用场景-CSDN博客
将matlab中获得的坐标点作为输入,这里需要注意的是点坐标需要是整像素
cv::Mat img = cv::imread("coins.png", 0);
cv::Mat bw = cv::Mat::zeros(img.size(), img.type());
std::vector<cv::Point2f> maskPoints{ cv::Point2f(94.4008,65.8329),
cv::Point2f(107.9901,62.0000),
cv::Point2f(120.8824,63.3938),
cv::Point2f(131.3357,73.4986),
cv::Point2f(135.1686,93.3598),
cv::Point2f(125.4122,105.5552),
cv::Point2f(101.3697,109.3881),
cv::Point2f(88.4773,98.9348),
cv::Point2f(84.6445,84.3003),
cv::Point2f(88.4773,72.4533),
cv::Point2f(94.4008,65.8329) };
std::vector<cv::Point> masklayerxy;
for (int j = 0; j < maskPoints.size(); j++)
{
cv::Point tmp;
tmp.x = (int)(maskPoints[j].x);
tmp.y = (int)(maskPoints[j].y);
masklayerxy.push_back(tmp);
}
//将img中多边形区域转换为二值掩模——多边形区域内像素值为255,外为0
cv::fillPoly(bw, masklayerxy, cv::Scalar(255, 255, 255));
使用Image Watch插件可以直接看到bw的图像,基本上和matlab一致