matlab - 计算物体外接半径和内接半径 - Matlab
问题描述
我正在尝试使用下面的代码计算两个对象的外接半径和内接半径。我使用了这个脚本中的 inscribedRadius 参数 和外接半径我使用了这个函数
我不明白为什么我得到内切半径大于外接半径的盒子形状。知道有什么问题吗?以及如何解决?
代码:
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(圆形)
解决方案
如果您查看mask
图像,您会注意到绘制的正方形形状与图像的右边缘和下边缘接触。只有形状的左侧和顶部有背景。距离变换bwdist(~mask)
随后计算形状内每个像素到背景的距离,但由于只有左侧和顶部有背景,因此形状右下角的像素距离为 1000,而不是 1。距离变换应该在中间有一个最大值,在与至少三个最近的形状边缘点等距的点处。
解决方案很简单:poly2mask
必须创建一个宽高一个像素的图像:
mask = poly2mask(x2s, y2s, ceil(max(y2s)) + 1, ceil(max(x2s)) + 1);
^^^ ^^^
有了这个改变,inscribedRadius
平方的计算结果是 132,正如预期的那样。
推荐阅读
- arrays - 创建一个javascript数组到localstorage不返回所需的结果
- database-design - 具有可编辑部分的复合主键
- django - 如何在 django rest 框架嵌套序列化程序中验证需要来自父级数据的子序列化程序?
- python - 如何将多行缩进脚本作为字符串传递给python解释器(-c)
- python - 带有 fit_generator 的 Keras 错误:检查目标时出错:预期 softmax_1 的形状为 (2,),但得到的数组的形状为 (1,)
- c++ - C++ 中指针使用的箭头标记“->”有不同的用途吗?它究竟是如何使用的?
- node.js - 节点包管理器测试用例问题
- php - laravel 查询 - 在两个相关表之间使用多个条件约束
- typescript - TypeScript:使用对象类型的值重新映射联合类型
- sql - Postgres jsonb 字段到数组