穿过形状质心

时间:2017-03-22 14:21:15

标签: matlab geometry line shape min

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

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

GREATEST DIAMETER

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

  

使用griddedInterpolant时出错   输入点的坐标必须是有限值; Inf是不允许的。

我需要做些什么来找到这个物体的最短“直径”(即穿过质心)?

1 个答案:

答案 0 :(得分:0)

可以使用这样的极性图像:

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');

,输出为:

enter image description here