Matlab 用循环邻域法求分支度

Matlab 用循环邻域法求分支度,matlab,Matlab,我有一个骨架图像。如下面的链接所示 我已检测到分支点和端点,并标记了图像。现在我在每个分支上画一个圆,我使用下面的代码在每个分支上画一个圆 mn=bwmorph(y,'branchpoints'); [row column] = find(mn); branchPts = [row column]; endImg = bwmorph(y, 'endpoints'); [row column] = find(endImg); endPts = [row column];

我有一个骨架图像。如下面的链接所示

我已检测到分支点和端点,并标记了图像。现在我在每个分支上画一个圆,我使用下面的代码在每个分支上画一个圆

mn=bwmorph(y,'branchpoints');
[row column] = find(mn);
branchPts    = [row column];
endImg    = bwmorph(y, 'endpoints');
[row column] = find(endImg);
endPts       = [row column];
figure;imshow(y);
hold on ; 
plot(branchPts(:,2),branchPts(:,1),'rx');
hold on; plot(endPts(:,2),endPts(:,1),'*');
% Labeling the Branches
branches = (y & ~mn); % set branch points to zero
figure; imshow(branches);
branchesLabeled = bwlabel( branches); % label connected components
vislabels(branchesLabeled)
% Calculation of Length of Branches and Circular Neighbourhood Method for
% for detection of normal and abnormal branches.
sts = regionprops( branchesLabeled,'Area', 'Perimeter','MajorAxisLength','Centroid' );
% extract properties
% Loop for circles
for i=1:size(sts)
r= sts(i).MajorAxisLength/2 ; %desired radius
centerx = sts(i).Centroid(1);  
centery = sts(i).Centroid(2);
th = 0:pi/50:2*pi;
xunit = r * cos(th) + centerx;
yunit = r * sin(th) + centery;
figure; imshow(branchesLabeled);hold on;h = plot(xunit, yunit);
end 
我对这段代码有几个问题

  • 在骨架的中心线上绘制圆(它不是分支,而是骨架的中心线)

  • 这段代码给了我很多图像(每个分支一个)。我想在同一个图像上的每个分支上画一个圆圈


  • 我想通过使用圆形邻接法(通过在每个分支上绘制圆圈并检查圆圈中的背景像素数)来确定分支的程度。

    对于问题1,您正在为
    sts
    结构中的所有内容绘制圆圈。您需要了解如何在
    sts
    中仅获取分支位置

    对于问题2,您需要调用
    并在循环外部绘制图像。然后在循环中调用
    plot
    ,绘制每个圆。大概是这样的:

    figure
    imshow(branchesLabeled)
    hold on
    for i=1:size(sts)
        % your other code here...
        plot(xunit, yunit);
    end
    

    谢谢你的回复。在问题1中,我希望在骨架分支上画圆圈,而不是在中心线上(中心线显示在下面带有蓝色箭头的链接中),我正在获取此骨架的ROI,绘制分支点并标记ROI。但如问题链接中所示,我得到的是中心线上的圆,而不是分支上的圆。另请参见下面的链接,它显示了每个分支上的圆以及骨架的中心线上的圆。我不想在骨架线上画圆圈,只想在每个分支上画圆圈。谢谢问题是,当我在图像上做标记时,我使用的是分支=(y&~mn);也就是说,我正在反转分支点。这就是为什么骨骼的中心线并没有完全连接。它在分支点断裂。因此,上述代码将中心线视为分支,并在其上绘制圆。但我没有选择,因为BWLabel只考虑单独的对象进行标记。如果不反转分支点,BWLABLE将不会标记该分支。我是Matlab新手,不知道用其他方法检测骨骼中的分支。你能帮忙吗?