当前位置: 首页 > 知识库问答 >
问题:

如何绘制以质心为中心的特定像素区域的正方形

尹昂雄
2023-03-14

我在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等星团代表一颗恒星。我使用了这个链接提供的答案:如何在Matlab中找到二进制图像中所有连接的组件?标记像素。然后,代码会找到每个像素簇的面积和质心。

现在我想包括一些代码,这些代码将自动绘制以每个质心为中心的特定像素区域的方框。例如,质心的位置为[41290],像素簇的面积为6像素,我想画一个面积为nx6像素的长方体,长方体的中心为[41290]。我需要这个循环通过每个质心,并且做同样的事情。

我该怎么做呢?

质心和区号如下所示。

%% Calculate centroids of each labelled pixel cluster within binary image

N = max(B(:));    % total number of pixel labels generated in output array B
sum_v = zeros(N,1);    % create N x 1 array of 0's
sum_iv = zeros(N,1);    % "
sum_jv = zeros(N,1);    % "
for jj=1:size(B,2)    % search through y positions
   for ii=1:size(B,1)    % search through x positions
      index = B(ii,jj);
      if index>0     
         sum_v(index) = sum_v(index) + 1;
         sum_iv(index) = sum_iv(index) + ii;
         sum_jv(index) = sum_jv(index) + jj;
      end
   end
end
centroids = [sum_jv, sum_iv] ./ sum_v    % calculates centroids for each cluster

for pp = 1:N
    id_index = find(B == pp);
    pixels = numel(id_index);    %  counts number of pixels in each cluster    
    area(pp) = pixels;    % area = no. of pixels per cluster
end

hold on
for i=1:size(centroids,1)
    plot(centroids(i,1),centroids(i,2),'rx','MarkerSize',10)
end
hold off

共有1个答案

严安志
2023-03-14

我通过以下方法解决了这个问题:

  • 将质心的(x,y)坐标分为x和y

代码如下。

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

% for pp = 1:ID_counter
%     id_index = find(B == pp);
%     pixels = numel(id_index);    %  counts number of pixels in each cluster    
%     area(pp) = pixels;    % area = no. of pixels per cluster
%     gray_area = area*2;
% end


hold on
for xl=1:size(x_lower_limits,1)
                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
 类似资料:
  • 我想从二值图像中得到圆形状的质心,但输出给出了不止一个质心。我使用的是opencv web教程文档中关于图像时刻和修改的代码。供参考,我使用的是C++API OpenCV。 输出结果是: 我预计,文本输出可能会从3个轮廓中给出3个质心,但实际上是7个轮廓(轮廓[0],...,轮廓[6])。

  • 如何计算由像素组成的簇的质心? 我用它们的红色、蓝色和绿色值来表示像素(例如,)。 形心应该是集群中实例的平均值,但是如何计算像素之间的平均值呢? [我试图计算每种颜色的平均值(质心[“红色”]=总和\红色\像素\值/像素数等),但结果不正确] 如果有帮助的话,我用的是欧几里德距离函数。

  • 问题内容: 我有一张根据某些数据计算得出的图表,绘制在matplotlib中。我想在此图的全局最大值周围绘制一个矩形区域。我试过,但通话时似乎没有出现矩形 那么,如何在matplotlib图上绘制矩形区域?谢谢! 问题答案: 最可能的原因是在调用axhspan时将数据单元用作x参数。从函数的文档(我的重点): y坐标以数据单位为单位, x坐标以轴(相对于0-1)为单位 。 因此,任何向左拉伸为0或

  • 我是新来的。我正在尝试更改颜色(或其他参数,如色调、饱和度…)每个像素周围的像素。 我没有得到任何改变,而是得到了想要的结果。求求你,帮帮任何人(

  • > 我有一张NxM大小的原始图像(FigureB-它是原始图像的蓝色香奈儿),从这张图像中我选择一个特定的区域来研究(NewfigureB),大小120x170; 然后我将这个区域划分为我所说的宏像素,即10x10的数据点(像素)阵列; 我然后在所选区域上涂上掩膜,只选择符合一定发光条件的点; 到目前为止,这是我想出来的。如有任何帮助,将不胜感激。 多谢

  • 问题内容: 我加入一堆s转换为,当用户选择通过菜单打开的各种特征。但是我希望内部框架以桌面窗格为中心打开,而不是默认情况下位于左上方的内部框架。 如何指定JInternalFrames居中打开,或在打开后将其移动到中心? 问题答案: 作为参考,这是我根据dogbane的建议使用的解决方案: