如何在Matlab中读取坐标文本文件并用于regionprops分析(如Centroid)
从坐标文件计算区域质心(MATLAB regionprops 正确用法)
我来帮你搞定这个问题~你当前的代码没法直接用regionprops,核心原因是这个函数是用来分析图像中的连通区域的,它的输入得是二值图像或者标注矩阵,不能直接传从文本读出来的原始坐标列表。下面一步步给你拆解解决方案:
1. 正确读取坐标文件
你的读取逻辑没问题,但需要把textscan返回的cell数组转换成标准的N×2坐标矩阵,方便后续处理:
filename = fullfile('E:/outline.txt'); fileID = fopen(filename); % 读取所有(x,y)坐标对,得到两个列向量的cell容器 C = textscan(fileID,'%d %d'); fclose(fileID); % 合并成N行2列的坐标矩阵,第一列存x坐标,第二列存y坐标 coords = [C{1}, C{2}];
2. 将坐标转换成二值图像
我们需要创建一个刚好能容纳所有坐标点的二值图像,把这些坐标点标记为前景(1),其余区域设为背景(0):
% 获取坐标的极值,确定图像的最小尺寸 min_x = min(coords(:,1)); max_x = max(coords(:,1)); min_y = min(coords(:,2)); max_y = max(coords(:,2)); % 创建空白二值图像(MATLAB图像索引从1开始,所以要做坐标偏移) binary_img = false(max_y - min_y + 1, max_x - min_x + 1); % 将原始坐标映射到图像的索引位置 img_x = coords(:,1) - min_x + 1; img_y = coords(:,2) - min_y + 1; % 把对应位置设为true(前景区域) binary_img(sub2ind(size(binary_img), img_y, img_x)) = true;
3. 用regionprops计算质心
现在有了合法的二值图像输入,就可以正常调用regionprops了。注意这里得到的质心是相对于我们创建的小图像的,需要转换回原始坐标系统:
% 计算轮廓点构成区域的质心 stats = regionprops(binary_img, 'Centroid'); % 转换回原始坐标 original_centroid = [stats.Centroid(1) + min_x - 1, stats.Centroid(2) + min_y - 1]; disp('原始坐标下的轮廓质心:'); disp(original_centroid);
可选:计算实心区域的质心
如果你的坐标是闭合轮廓,想要计算实心区域的质心,可以先填充二值图像的孔洞:
% 填充二值图像的孔洞 binary_img_filled = imfill(binary_img, 'holes'); % 计算填充后区域的质心 stats_filled = regionprops(binary_img_filled, 'Centroid'); original_centroid_filled = [stats_filled.Centroid(1) + min_x - 1, stats_filled.Centroid(2) + min_y - 1]; disp('原始坐标下的实心区域质心:'); disp(original_centroid_filled);
这样就能得到你想要的质心结果啦~
内容的提问来源于stack exchange,提问作者jane
相关产品推荐
相关产品推荐

