1

私はこのイメージを持っています:

ここに画像の説明を入力

さまざまな形があり、それぞれの形を円に変換したい. また、形状のサイズに応じて、各円の半径は異なる必要があります。どうやってやるの?モルフォロジー操作を使用するか、Matlab にそれを行う機能はありますか? 関数 Regionprops を使用して個々の形状をすべて検出し、各領域に対して個別に操作を実行できます。

ここに画像の説明を入力

4

1 に答える 1

3

bwlabel最初にすべてのコンポーネントにラベルを付けるために使用します。次にregionprops、各コンポーネントの境界ボックスを見つけるために使用します。次に、 を値rectangleとともに使用して、各境界ボックスに楕円をプロットできます。Curvature[1 1]

%// Load the image and convert to 0's and 1's
img = imread('http://i.stack.imgur.com/9wRYK.png');
img = double(img(:,:,1) > 0);

%// Label the image
L = bwlabel(img);

%// Compute region properties
P = regionprops(L);

imshow(img)

for k = 1:numel(P)
    %// Get the bounding box
    bb = P(k).BoundingBox;

    %// Plot an ellipse around each object
    hold on
    rectangle('Position', bb, ...
              'Curvature', [1 1], ...
              'EdgeColor', 'r', ...
              'LineWidth', 2);
end

ここに画像の説明を入力

実際に円が必要な場合は、長方形から円を正確に定義する方法を決定する必要があります。このために、直径の幅と高さの最大値を使用しました。

t = linspace(0, 2*pi, 100);
cost = cos(t);
sint = sin(t);

for k = 1:numel(P)
    bb = P(k).BoundingBox;

    %// Compute the radius and center of the circle
    center = [bb(1)+0.5*bb(3), bb(2)+0.5*bb(4)];
    radius = max(bb(3:4)) / 2;

    %// Plot each circle
    plot(center(1) + radius * cost, ...
         center(2) + radius * sint, ...
         'Color', 'r');
end

ここに画像の説明を入力

単に表示するのではなく、実際に画像データ自体を変更したい場合はmeshgrid、すべてのピクセルの中心を使用して、特定のピクセルが円内にあるかどうかをテストできます。

%// Create a new image the size of the old one
newImage = zeros(size(img));

%// Determine the x/y coordinates for each pixel
[xx,yy] = meshgrid(1:size(newImage, 2), 1:size(newImage, 1));
xy = [xx(:), yy(:)];

for k = 1:numel(P)
    bb = P(k).BoundingBox;

    %// Compute the circle that fits each bounding box
    center = [bb(1)+0.5*bb(3), bb(2)+0.5*bb(4)];
    radius = max(bb(3:4)) / 2;

    %// Now check if each pixel is within this circle
    incircle = sum(bsxfun(@minus, xy, center).^2, 2) <= radius^2;

    %// Change the values of newImage
    newImage(incircle) = k;
end

%// Create a binary mask of all points that were within any circle
mask = newImage > 0;

ここに画像の説明を入力

于 2016-04-17T23:15:20.677 に答える