matlab中对象/连通组件的质心?

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是部分错误的...我该怎么办?

Ego*_*gon 6

您获得的值是这些对象的精确质心.所以你可能想要定义你期望得到的结果.

为了使这更清楚,我已经为矩阵中的对象着色.通过笛卡尔网格上的对称性,质心的左右两侧应该有相同数量的点,质心上方/下方应该相同.我绘制了一个彩色物体的图形,以及表示水平和垂直中心线的线条.那些是我们在它们的左/右(或上/下)具有相同数量的点的线,它们是某个对象的一部分.

它们的交点是质心,所以你可以看到质心所在的物体5(蓝色)(8, 14).对于其他两个对象,这些中心线不位于您拥有的整数网格上:红色对象(1)的质心(12.5, 7)也是代码的结果,绿色对象(2)以中心为中心(2.5, 10.5).

您将不得不忍受通过舍入质心(例如round(cx))引入的不准确性,或者您必须使用质心的非整数坐标.

图示

接下来,我还建议您像oli所示那样对代码进行矢量化:这使您可以更快地运行代码,并且当您熟悉MATLAB而不是for循环时更容易理解.

关于你的字符串表示可能有一点注意事项:不要%d用于非整数,因为你看到它会导致实数以科学记数法显示.我认为如果你使用像%0.2f格式字符串这样的东西会更清楚.