Полученные вами значения являются точными центроидами для этих объектов.Так что вы можете определить, что вы ожидаете получить в качестве результата.
Чтобы сделать это более ясным, я раскрасил объекты в вашей матрице.По симметрии вашей декартовой сетки, должно быть равное количество точек слева и справа от вашей центроида и одинаковое для выше / ниже центроида.Я нарисовал фигуру с вашими объектами в цвете вместе с линиями, чтобы представить горизонтальные и вертикальные центральные линии.Это линии, для которых у нас есть равное количество точек слева / справа (или выше / ниже) из них, которые являются частью определенного объекта.
Их пересечение - это центроид, так что вы можете видетьдля объекта 5 (синего цвета) центр тяжести находится на (8, 14)
.Для двух других объектов эти центральные линии не лежат на вашей целочисленной сетке: красный объект (1) имеет центр тяжести на (12.5, 7)
, который также является результатом вашего кода, а зеленый объект (2) центрируется вокруг(2.5, 10.5)
.
Вам придется либо жить с неточностью, введенной округлением центроидов (например, round(cx)
), либо вам придется жить с нецелыми координатами центроидов.
Кроме того, я также рекомендую вам векторизовать ваш код, как показало oli: это позволяет быстрее выполнять ваш код, и его легче понять, если вы немного знакомы с MATLAB, чем for
loops.
Возможно, небольшое замечание относительно вашего строкового представления: не используйте %d
для нецелых чисел, поскольку вы видите, что реальные цифры будут отображаться в научной нотации.Я думаю, что будет понятнее, если вы используете что-то вроде %0.2f
в качестве строки формата.