Aye*_*han 0 matlab image-processing matrix
我试图找到物体的质心.我已经实现了连接组件标签,我已经为质心开发了以下代码,它确实给出了结果但没有给出正确的结果:我有以下输出矩阵,即matrix_img:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0
2 2 2 2 0 0 0 0 0 1 1 1 1 1 1 0
2 2 2 2 0 0 0 0 1 1 1 1 1 1 1 1
2 2 2 2 0 0 0 0 1 1 1 1 1 1 1 1
2 2 2 2 0 0 0 0 1 1 1 1 1 1 1 1
2 2 2 2 0 0 0 0 0 1 1 1 1 1 1 0
2 2 2 2 0 0 0 0 0 0 1 1 1 1 0 0
2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0
2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0
2 2 2 2 0 0 5 5 5 0 0 0 0 0 0 0
2 2 2 2 0 0 5 5 5 0 0 0 0 0 0 0
2 2 2 2 0 0 5 5 5 0 0 0 0 0 0 0
2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
以下是代码
n= max(max(matrix_img));
for k=1:n
a(k)=length(find(matrix_img==k));
sx(k)=0;
sy(k)=0;
cx=0;
cy=0;
for i=1:1:r
for j=1:1:c
if(matrix_img(i,j)==k)
sx(k)=sx(k)+i;
sy(k)=sy(k)+j;
cx=sx(k)/a(k);
cy=sy(k)/a(k);
end
end
end
fprintf('Centroid of Object %d is %d and %d \n', k, cx, cy);
end
Run Code Online (Sandbox Code Playgroud)
它给出的结果如下:
Centroid of Object 1 is 7 and 1.250000e+001
Centroid of Object 2 is 1.050000e+001 and 2.500000e+000
Centroid of Object 3 is 0 and 0
Centroid of Object 4 is 0 and 0
Centroid of Object 5 is 14 and 8
Run Code Online (Sandbox Code Playgroud)
对象5的结果是正确的,对象2是完全错误的,对象1是部分错误的...我该怎么办?
您获得的值是这些对象的精确质心.所以你可能想要定义你期望得到的结果.
为了使这更清楚,我已经为矩阵中的对象着色.通过笛卡尔网格上的对称性,质心的左右两侧应该有相同数量的点,质心上方/下方应该相同.我绘制了一个彩色物体的图形,以及表示水平和垂直中心线的线条.那些是我们在它们的左/右(或上/下)具有相同数量的点的线,它们是某个对象的一部分.
它们的交点是质心,所以你可以看到质心所在的物体5(蓝色)(8, 14).对于其他两个对象,这些中心线不位于您拥有的整数网格上:红色对象(1)的质心(12.5, 7)也是代码的结果,绿色对象(2)以中心为中心(2.5, 10.5).
您将不得不忍受通过舍入质心(例如round(cx))引入的不准确性,或者您必须使用质心的非整数坐标.

接下来,我还建议您像oli所示那样对代码进行矢量化:这使您可以更快地运行代码,并且当您熟悉MATLAB而不是for循环时更容易理解.
关于你的字符串表示可能有一点注意事项:不要%d用于非整数,因为你看到它会导致实数以科学记数法显示.我认为如果你使用像%0.2f格式字符串这样的东西会更清楚.