计算对象的外接半径和内切半径-Matlab

问题描述 投票:2回答:1

我正在尝试使用以下代码来计算两个对象的外接半径和内接半径。我使用了script的inscribedRadius参数,使用了外接的半径function

我不明白为什么我得到的内接半径大于外接半径。知道有什么问题吗?以及如何解决?

图像enter image description here

代码:

clc;
clear;

RGB = imcomplement(imread('https://i.stack.imgur.com/8WLAt.jpg'));
I = rgb2gray(RGB);
bw = imbinarize(I);
bw = imfill(bw,'holes');
imshow(bw)
hold on;  

[B,L] = bwboundaries(bw,'noholes');
stats = regionprops(L,'Centroid','MajorAxisLength');

for i = 1 : numel(stats)
    b = B{i};
    c = stats(i).Centroid;
    y = b(:,1);
    x = b(:,2);
    plot( b(:,2),b(:,1),'Color','red','linewidth',2);
    text(c(1),c(2),num2str(i),'Color','red'); 

    xMin = min(x);
    xMax = max(x);
    yMin = min(y);
    yMax = max(y);
    scalingFactor = 1000 / min([xMax-xMin, yMax-yMin]);
    x2s = (x - xMin) * scalingFactor + 1;
    y2s = (y - yMin) * scalingFactor + 1;
    mask = poly2mask(x2s, y2s, ceil(max(y2s)), ceil(max(x2s)));

    edtImage = bwdist(~mask);

    inscribedRadius = max(edtImage(:));
    [yCenter, xCenter] = find(edtImage == inscribedRadius);

    xCenter = (xCenter - 1)/ scalingFactor + xMin;
    yCenter = (yCenter - 1)/ scalingFactor + yMin;
    inscribedRadius = inscribedRadius / scalingFactor

    [circumscribedCenter,circumscribedRadius] = minboundcircle(x,y); % from https://www.mathworks.com/matlabcentral/fileexchange/34767-a-suite-of-minimal-bounding-objects?focused=3820656&tab=function
    circumscribedRadius     
end

结果是:

  • 对象1:inscribedRadius = 264,cumscribedRadius = 186.6762
  • 对象2:inscribedRadius = 130.4079,circumscribedRadius = 132.3831

对象1(框)的值错误,因为inscribedRadius不能大于cumscribedRadius。它们适用于对象2(圆圈)

matlab geometry radius
1个回答
1
投票

[如果您查看mask图像,您会注意到绘制的正方形触摸了图像的右边缘和下边缘。仅在形状的左侧和顶部有背景。距离变换bwdist(~mask)随后为形状内的每个像素计算到背景的距离,但是由于背景仅在左边和顶部,因此在形状右下角的像素的距离为1000,而不是1。距离变换应该在中间有一个最大值,该点至少与三个最近的形状边缘点等距。

解决方案很简单:poly2mask必须创建一个宽一像素高的图像:

mask = poly2mask(x2s, y2s, ceil(max(y2s)) + 1, ceil(max(x2s)) + 1);
                                          ^^^                 ^^^

与预期的一样,平方的计算出的inscribedRadius为132。

© www.soinside.com 2019 - 2024. All rights reserved.