Matlab旋转后提取物体XY坐标及质心 导出JMP绘图异常求助
问题成因
- 坐标系规则不匹配:Matlab处理图像时默认使用左上角为原点,Y轴向下递增的图像坐标系,而JMP散点图默认使用左下角为原点,Y轴向上递增的笛卡尔坐标系,二者Y轴方向完全相反,导入后会出现垂直翻转的视觉效果,看起来像是额外发生了旋转偏移。
- 质心数据未导出:你的代码中仅将轮廓的X、Y坐标写入了csv文件,没有把计算得到的质心坐标加入导出表格,因此JMP导入后不存在质心数据,自然无法正常显示。
- 坐标映射逻辑混淆:你在Matlab中测试画图时使用了
plot(yCentre,xCentre)的写法,人为交换了质心的X、Y坐标顺序,导出时如果没有统一顺序,也会进一步加剧坐标错位问题。
解决方案
1. 修正Matlab坐标计算与导出逻辑
修改代码,对Y坐标做方向翻转,同时将质心坐标同步写入导出表格,修正后的参考代码如下:
clc; clear; close all; url='http://clipart-library.com/newimages/fish-clip-art-32.png'; I = rgb2gray(imread(url)); rotAngle = 55; % 旋转图像 I = imrotate(I, rotAngle,'nearest','loose'); % 获取旋转后图像的高度,用于翻转Y坐标 [imgH, ~] = size(I); [B,L] = bwboundaries(I,'noholes'); k=1; stat = regionprops(I,'Centroid'); b = B{k}; % 轮廓坐标处理,Y轴翻转匹配笛卡尔坐标系 xBoundary = b(:,2); yBoundary = imgH - b(:,1); % 质心坐标处理,Y轴翻转 centroidObject = stat(k).Centroid; xCentre = centroidObject(1); yCentre = imgH - centroidObject(2); % 构造导出表格,包含轮廓坐标和对应质心坐标 dataTable = table(xBoundary, yBoundary, ... repmat(xCentre, height(xBoundary), 1), ... repmat(yCentre, height(xBoundary), 1), ... 'VariableNames', {'轮廓X', '轮廓Y', '质心X', '质心Y'}); writetable(dataTable,'E:/dataTable.csv') % 验证绘图,坐标顺序无需交换 hold on; plot(xCentre,yCentre,'Marker','x','Color','r'); plot(xBoundary,yBoundary,'Color','g');
2. JMP绘图设置
导入修正后的csv文件后,绘制散点图时:
- 轮廓系列选择
轮廓X作为X轴,轮廓Y作为Y轴 - 质心系列选择
质心X作为X轴,质心Y作为Y轴,单独设置标记样式即可正常显示
内容的提问来源于stack exchange,提问作者JohnSal
相关产品推荐
相关产品推荐

