如何在MATLAB中对图像多边形掩膜,仅保留内部并将外部设为黑色?
实现多边形外部区域置黑的掩膜处理方案
嘿,我来帮你搞定这个需求!你已经用insertShape画出了多边形,现在要把外部区域全部变黑,核心思路是先创建一个和原图匹配的二值掩膜,再用这个掩膜过滤原图——只保留多边形内部的像素,外部直接置黑。
下面是具体的实现步骤和完整代码:
步骤拆解
- 拆分多边形坐标:你的
pos是[x1 y1 x2 y2 ... xn yn]的格式,需要把x和y坐标分开提取,方便后续创建掩膜。 - 生成二值掩膜:用Matlab的
poly2mask函数,把多边形坐标转换成和原图大小一致的二值掩膜——多边形内部为1,外部为0。 - 适配图像通道:如果原图是RGB彩色图,要把单通道的掩膜复制成3通道,保证和原图维度匹配。
- 应用掩膜:将原图和掩膜做元素相乘,掩膜为0的区域(外部)就会变成黑色,为1的区域(内部)保留原图像素。
完整代码示例
% 读取原始图像 i = imread('Vlc1.1.png'); % 你定义的多边形坐标 pos = [170 350 290 230 430 230 600 350 170 350]; % 1. 拆分x和y坐标:奇数位是x,偶数位是y x_coords = pos(1:2:end); y_coords = pos(2:2:end); % 2. 创建二值掩膜:参数依次是x坐标、y坐标、图像高度、图像宽度 mask = poly2mask(x_coords, y_coords, size(i,1), size(i,2)); % 3. 适配RGB图像的3通道(灰度图可跳过此步) if size(i,3) == 3 mask = repmat(mask, [1 1 3]); end % 4. 应用掩膜,外部区域置黑 masked_image = i .* uint8(mask); % 对比展示原图和处理后的图像 figure; subplot(1,2,1); imshow(i); title('原始图像'); subplot(1,2,2); imshow(masked_image); title('掩膜处理后(外部置黑)');
关键细节说明
- 确保你已经安装了Matlab的图像处理工具箱,
poly2mask是这个工具箱里的函数; - 如果你的原图是灰度图,直接去掉
repmat那一行即可,因为灰度图是单通道,和掩膜维度一致; uint8(mask)是把逻辑型的掩膜(0/1)转换成无符号8位整数,这样和原图(通常是uint8类型)相乘时不会出现类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Jema




