You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Matlab中对五个点围合区域内的图像进行裁剪?

解决五个点围合多边形区域的图像裁剪问题

嘿,我看到你尝试用imcrop裁剪五个点围合的区域但没成功——这很正常,因为imcrop默认只能处理矩形选区,而你需要的是多边形区域的裁剪。咱们来一步步修正这个问题:

先说说你现有代码的问题

你当前的代码里,imcrop的参数用了[bx1 by1 bx5 by5],但imcrop的正确参数格式是[xmin ymin width height],不是两个对角点的坐标。更关键的是,就算参数格式对了,imcrop也只能剪出矩形,没法直接处理多边形区域。

可行的实现方法

要裁剪多边形围合的区域,核心思路是先创建一个多边形掩码(mask),再用掩码提取图像中对应的区域。这里有两种常用的方法:

方法1:用掩码提取多边形区域(保留最小包围矩形,仅显示多边形内像素)

这个方法会先剪出多边形的最小包围矩形,再把矩形内不属于多边形的部分设为背景(比如黑色):

% 假设fixedPoints是5个点的坐标矩阵(5x2,每行是[x,y])
fixedPoints = cat(1, cc.Centroid);

% 获取原图像尺寸
[h, w, ~] = size(n_im_base);

% 计算多边形的最小包围矩形参数
xmin = min(fixedPoints(:, 1));
ymin = min(fixedPoints(:, 2));
xmax = max(fixedPoints(:, 1));
ymax = max(fixedPoints(:, 2));
rect_width = xmax - xmin;
rect_height = ymax - ymin;

% 裁剪出最小包围矩形区域
rect_crop = imcrop(n_im_base, [xmin ymin rect_width rect_height]);

% 创建适配裁剪后矩形的多边形掩码
mask_crop = poly2mask(fixedPoints(:,1)-xmin, fixedPoints(:,2)-ymin, rect_height, rect_width);

% 应用掩码,将非多边形区域设为背景(这里用0,你也可以设为其他值)
base_crop = rect_crop;
base_crop(~mask_crop) = 0;

% 显示结果
figure; imshow(base_crop);

方法2:直接提取多边形内的像素(用roipoly函数)

如果你不需要保留包围矩形,只想得到多边形内的图像(其他区域透明或黑色),可以用roipoly直接生成掩码并提取:

% 同样基于fixedPoints(5x2的坐标矩阵)
fixedPoints = cat(1, cc.Centroid);

% 生成多边形掩码
poly_mask = roipoly(n_im_base, fixedPoints(:,1), fixedPoints(:,2));

% 将掩码与原图像相乘,提取多边形内的像素
base_crop = n_im_base .* uint8(poly_mask);

% 显示结果
figure; imshow(base_crop);

额外提示

  • 确保fixedPoints是正确的5x2矩阵:regionprops返回的Centroid是每个区域的中心坐标,cat(1, cc.Centroid)会把这些坐标堆叠成Nx2的矩阵(N是区域数量),如果你的五个点是五个区域的中心,那这个矩阵就是5行2列的,索引的时候别搞错哦。
  • 如果你的图像是彩色的,上面的方法同样适用,因为poly2maskroipoly会自动处理多通道图像的掩码。

试试上面的方法,应该就能得到你想要的五个点围合区域的裁剪结果啦!

内容的提问来源于stack exchange,提问作者Khataab

火山引擎 最新活动