通过形状质心的边界点之间的最短线

Shortest line between boundary points that passes through the centroid of a shape

lesion image

我有一个形状不规则的物体,我必须在其中找到最大和最小直径。

为了找到最大直径,我提取了边界点并找到了所有点之间的距离。在那些给我最大直径的距离中,我选择了最大距离。

boundaries = bwboundaries(binaryImage);
numberOfBoundaries = size(boundaries, 1);
for blobIndex = 1 : numberOfBoundaries
    thisBoundary = boundaries{blobIndex};
    x = thisBoundary(:, 2); % x = columns.
    y = thisBoundary(:, 1); % y = rows.

    % Find which two boundary points are farthest from each other.
    maxDistance = -inf;
    for k = 1 : length(x)
        distances = sqrt( (x(k) - x) .^ 2 + (y(k) - y) .^ 2 );
        [thisMaxDistance, indexOfMaxDistance] = max(distances);
        if thisMaxDistance > maxDistance
            maxDistance = thisMaxDistance;
            index1 = k;
            index2 = indexOfMaxDistance;
        end
    end

我附上了包含最长直径的图片。

我还需要一条线段,该线段穿过连接两个长度最短的边界点的质心。当我尝试通过修改上述代码找到最短直径时,要找到 min(distances),我收到一条错误消息:

Error using griddedInterpolant The coordinates of the input points must be finite values; Inf and NaN are not permitted.

求这个物体最短的"diameter"(也就是过质心)怎么办?

可以像这样使用极地图像:

lesion = imread('lesion.jpg');
bw = lesion > 100;
c = regionprops(bw,'Centroid');
c = c.Centroid;
% polar args
t = linspace(0,2*pi,361);
t(end) = [];
r = 0:ceil(sqrt(numel(bw)/4));
[tg,rg] = meshgrid(t,r);
[xg,yg] = pol2cart(tg,rg);
xoff = xg + c(1);
yoff = yg + c(2);
% polar image
pbw = interp2(double(bw),xoff,yoff,'nearest') == 1;
[~,radlen] = min(pbw,[],1);
radlen(radlen == 1) = max(r);
n = numel(radlen);
% add two edges of line to form diameter
diamlen = radlen(1:n/2) + radlen(n/2+1:n);
% find min diameter
[mindiam,tminidx1] = min(diamlen);
tmin = t(tminidx1);
rmin = radlen(tminidx1);
tminidx2 = tminidx1 + n/2;
xx = [xoff(radlen(tminidx1),tminidx1) xoff(radlen(tminidx2),tminidx2)];
yy = [yoff(radlen(tminidx1),tminidx1) yoff(radlen(tminidx2),tminidx2)];
% viz
figure;
subplot(121);
imshow(pbw);
title('polar image');
subplot(122);
imshow(bw);
hold on
plot(c(1),c(2),'or')
plot(xx,yy,'g')
legend('centroid','shortest diameter');

输出为: