Я написал некоторый код в MATLAB, который преобразует изображение (звезд) в изображение в градациях серого, а затем в двоичное изображение с использованием установленного порога, а затем маркирует каждый кластер пикселей (звезд), который находится выше этого порога.Маркировка производит вывод: например,
[1 1 1 0 0 0 0 0 0
1 1 0 0 0 2 2 2 0
0 0 0 3 3 0 2 0 0
0 0 0 3 3 0 0 0 0]
Таким образом, каждый кластер из 1, 2, 3 и т. Д. Представляет звезду.После этого код затем находит центроиды каждого кластера пикселей и рисует ограничивающую рамку вокруг каждого центроида (центрированного на центроиде) с площадью 8 х 8 пикселей.Ограничения ограничивающего прямоугольника устанавливаются путем нахождения xmax, xmin, ymax, ymin каждого вычисленного центроида, что включает либо добавление, либо вычитание 4 (пикселей) из координат x и y каждого центроида.
Взвешенный центроидвычисляется следующим образом:
x_coordinate_centroid = sum (x_coordinate. * pixel_values) / sum_pixel_values y_coordinate_centroid = sum (y_coordinate. * pixel_values) / sum_pixel_values
x / y_coordinate и значения пикселей в пределах для координат являютсякаждый ограничивающий прямоугольник.
Ограничивающий прямоугольник будет окружать область 8 x 8 пикселей (с заданными интенсивностями) на изображении в градациях серого, например:
[100 100 100 90 20 20 0 0
80 90 100 90 20 30 0 0
50 70 100 70 30 0 20 0
50 0 0 60 30 30 0 0
0 0 0 0 0 0 0 0
0 50 0 0 0 0 0 0
0 40 0 0 0 0 0 0
0 20 0 0 0 0 0 0]
Верхнее левое значение ([xmin, ymax]), например, может иметь координаты изображения [41, 14] и интенсивность 100.
Вывод из моего кода, например, может дать 5 ограничительных рамок на изображении в градациях серого.Теперь мне нужно написать код, который автоматически вычисляет взвешенный центроид каждой области ограничительной рамки.Я не уверен, как это сделать, у кого-нибудь есть идеи, как этого достичь?
Мой код для вычисления центроидов и их ограничительных рамок показан ниже.
%% Calculate centroids of each labelled pixel cluster within binary image
N = max(B(:)); % total number of pixel labels generated in output array
sum_total = zeros(N,1); % create N x 1 array of 0's
sum_yv = zeros(N,1); % "
sum_xv = zeros(N,1); % "
for xx=1:size(B,2) % search through y positions
for yy=1:size(B,1) % search through x positions
index = B(yy,xx);
if index>0
sum_total(index) = sum_total(index) + 1;
sum_yv(index) = sum_yv(index) + yy;
sum_xv(index) = sum_xv(index) + xx;
end
end
end
centroids = [sum_xv, sum_yv] ./ sum_total; % calculates centroids for each cluster
x_lower_limits = centroids(:,1)-4;
y_lower_limits = centroids(:,2)+4; % lower on image means larger y coord number
x_upper_limits = centroids(:,1)+4;
y_upper_limits = centroids(:,2)-4; % higher on image means lower y coord number
x_lower_limits(x_lower_limits<1)=1; % limit smallest x coord to image axis (1,y)
y_lower_limits(y_lower_limits>size(binary_image,1))=size(binary_image,1); % limit largest y coord to image axis (x,517)
x_upper_limits(x_upper_limits>size(binary_image,2))=size(binary_image,2); % limit largest x coord to image axis (508,y)
y_upper_limits(y_upper_limits<1)=1; % limit smallest y coord to image axis (x,1)
width = x_upper_limits(:,1) - x_lower_limits(:,1); % width of bounding box
height = y_lower_limits(:,1) - y_upper_limits(:,1); % height of bounding box
hold on
for xl=1:size(x_lower_limits,1)
r(xl)=rectangle('Position',[x_lower_limits(xl,1) y_upper_limits(xl,1) width(xl,1) height(xl,1)],'EdgeColor','r');
end
for i=1:size(centroids,1)
plot(centroids(i,1),centroids(i,2),'rx','MarkerSize',10)
end
hold off
%%