Opencv(C++)&Matlab 将关注区域 (ROI) 多边形转换为区域掩膜

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一致

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值