gpt4 book ai didi

matlab - 计算物体外切半径和内切半径 - Matlab

转载 作者:行者123 更新时间:2023-12-03 14:38:03 25 4
gpt4 key购买 nike

我正在尝试使用下面的代码计算两个对象的外切半径和内切半径。我用于此 script 中的 inscribedRadius 参数对于外接半径,我使用了这个 function

我不明白为什么我得到内切半径大于外切半径的盒子形状。知道出了什么问题吗?以及如何修复它?

图片
enter image description here

代码:

clc;
clear;

RGB = imcomplement(imread('/image/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(圆圈)

    最佳答案

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

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

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

    通过此更改,计算出的 inscribedRadius正如预期的那样,正方形是 132。

    关于matlab - 计算物体外切半径和内切半径 - Matlab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61952354/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com