Matlab中轮廓转polyshape对象:方向异常与警告问题求解
解决MATLAB中轮廓转polyshape的方向异常与警告问题
针对你遇到的两个问题(绘图方向颠倒、polyshape有效性警告),我整理了具体的解决思路和修改后的代码:
一、先明确问题根源
- 方向异常:MATLAB图像坐标系的原点在左上角,y轴向下;而
plot函数的坐标系原点在左下角,y轴向上。直接用图像的行坐标(outline(:,1))作为plot的y值,必然会导致图形上下颠倒。 - 警告问题:
bwboundaries返回的边界点可能包含重复顶点、共线点,甚至点的顺序不合理导致多边形自交,这些都会触发polyshape的有效性检查警告。
二、具体解决步骤
1. 修复方向异常
只需要把图像的行坐标转换为plot坐标系的y坐标,添加这行代码即可:
outline(:,1) = size(bw, 1) - outline(:,1);
它的作用是把图像顶部的行(行号1)映射到plot坐标系的底部,底部行(行号等于图像高度size(bw,1))映射到顶部,完美匹配plot的方向逻辑。
2. 消除polyshape警告
我们需要清理边界点的冗余和不一致性,推荐两步操作:
- 去重顶点:用
unique按行去重,去掉重复的坐标点:outline = unique(outline, 'rows'); - 移除共线点:创建polyshape时关闭共线点保留,进一步精简顶点:
pgon = polyshape(outline, 'KeepCollinearPoints', false);
如果点的顺序导致自交,还可以加上Reorder参数让MATLAB自动重新排序点,确保多边形闭合且无交叉:
pgon = polyshape(outline, 'KeepCollinearPoints', false, 'Reorder', true);
三、修改后的完整代码
clc; clear; RGB = imread('pillsetc.png'); I = rgb2gray(RGB); bw = imbinarize(I); imshow(bw) bw = bwareaopen(bw,30); bw = imfill(bw,'holes'); imshow(bw) [B,L] = bwboundaries(bw,'noholes'); imshow(label2rgb(L, @jet, [.5 .5 .5])) hold on for k = 1:length(B) outline = B{k}; % 反转y坐标,修复方向问题 outline(:,1) = size(bw, 1) - outline(:,1); % 去重重复顶点 outline = unique(outline, 'rows'); % 创建合规的polyshape pgon = polyshape(outline, 'KeepCollinearPoints', false, 'Reorder', true); plot(pgon, 'w', 'LineWidth', 2) end hold off
额外验证方法
你可以运行isvalid(pgon)来检查生成的polyshape是否有效,如果返回true,说明警告的问题已经彻底解决啦。
内容的提问来源于stack exchange,提问作者AsiJapan
相关产品推荐
相关产品推荐

