如何使用MATLAB找到圆内包含的任意形状的区域

时间:2016-04-12 16:38:50

标签: matlab image-processing

我有一个任意形状,其外部边界已在MATLAB中使用bwboundaries进行了跟踪。使用regionprops,我可以计算出这个形状所包含的总面积。

但是,我想知道形状的部分区域,这些部分位于以坐标R为中心的已知半径[x1, y1]的圆内。实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

有几种方法可以解决这个问题。在执行bwboundaries(或regionprops)之前可以更改遮罩的一种方法,以便包含在给定圆圈内的像素。< / p>

此示例假设您已经传递给M的逻辑矩阵bwboundaries

function [A, boundaries] = traceWithinCircle(M, x1, y1, R);

    %// Get pixel centers
    [x,y] = meshgrid(1:size(M, 1), 1:size(M, 2));

    %// Compute their distance from x1, y1
    distances = sqrt(sum(bsxfun(@minus, [x(:), y(:)], [x1, y1]).^2, 2));

    %// Determine which are inside of the circle with radius R
    isInside = distances <= R;

    %// Set the values outside of this circle in M to zero
    %// This will ensure that they are not detected in bwboundaries
    M(~isInside) = 0;

    %// Now perform bwboundaries on things that are 
    %// inside the circle AND were 1 in M
    boundaries = bwboundaries(M);

    %// You can, however, get the area by simply counting the number of 1s in M
    A = sum(M(:));

    %// Of if you really want to use regionprops on M
    %// props = regionprops(M);
    %// otherArea = sum([props.Area]);
end

作为一个例子

%// Load some example data
data = load('mri');
M = data.D(:,:,12) > 60;

%// Trace the boundaries using the method described above
B = traceWithinCircle(M, 70, 90, 50);

%// Display the results
figure;
hax = axes();
him = imagesc(M, 'Parent', hax);
hold(hax, 'on');
colormap gray
axis(hax, 'image');

%// Plot the reference circle
t = linspace(0, 2*pi, 100);
plot(x1 + cos(t)*R, y1 + sin(t)*R);

%// Plot the segmented boundaries
B = bwboundaries(M);

for k = 1:numel(B)
    plot(B{k}(:,2), B{k}(:,1), 'r');
end

enter image description here