2

イメージ内の楕円形のオブジェクトを円になるまで引き延ばしたいと考えています。私のプログラムは現在、楕円形のオブジェクト(角度のあるコインなど)を含む画像を入力し、それをしきい値処理して2値化し、edge-detect / bwboundaries()を使用して関心領域を分離し、regionprops()を実行して長軸/短軸の長さを計算します.

基本的に、「MajorAxisLength」を直径として使用し、短軸でオブジェクトを引き伸ばして円を形成したいと考えています。これにどのようにアプローチすべきかについての提案は大歓迎です。閲覧用にいくつかのコードを追加しました (残念ながら、画像をアップロードするのに十分な評判がありません。2 値化された画像は、黒い背景に白い楕円のように見えます)。

編集: この手法を画像のグレースケール バージョンに適用して、ストレッチがどのように見えるかを調べたいと思います。

コードスニペット:

rgbImage = imread(fullFileName);
redChannel = rgbImage(:, :, 1);
binaryImage = redChannel < 90;
labeledImage = bwlabel(binaryImage);
area_measurements = regionprops(labeledImage,'Area');
allAreas = [area_measurements.Area];
biggestBlobIndex = find(allAreas == max(allAreas));
keeperBlobsImage = ismember(labeledImage, biggestBlobIndex);
measurements = regionprops(keeperBlobsImage,'Area','MajorAxisLength','MinorAxisLength')
4

2 に答える 2

1

あなたは円の直径を知っていて、中心が長軸と短軸が交差する場所であることを知っています。したがって、直径から半径を計算しr、画像内のすべてのピクセルについて、そのピクセルの円周の中心からのユークリッド距離が。未満であるかどうかを確認しますr。その場合は、ピクセルを白に着色します。それ以外の場合は、そのままにしておきます。

[M,N] = size(redChannel);
new_image = zeros(M,N);
for ii=1:M
    for jj=1:N
        if( sqrt((jj-center_x)^2 + (ii-center_y)^2) <= radius )
            new_image(ii,jj) = 1.0;
        end
    end
end

これは、ループを回避するために論理インデックスと組み合わせたmeshgrid関数を使用することでおそらく最適化できます。

于 2012-04-07T04:42:48.380 に答える
0

matlab フォーラムの多くの助けのおかげで、最終的に必要な変換を理解することができました。他の誰かがそれを必要とする場合に備えて、ここに投稿すると思いました。

    stats = regionprops(keeperBlobsImage, 'MajorAxisLength','MinorAxisLength','Centroid','Orientation');
    alpha = pi/180 * stats(1).Orientation;
    Q = [cos(alpha), -sin(alpha); sin(alpha), cos(alpha)];
    x0 = stats(1).Centroid.';
    a = stats(1).MajorAxisLength;
    b = stats(1).MinorAxisLength;
    S = diag([1, a/b]);
    C = Q*S*Q';
    d = (eye(2) - C)*x0;
    tform = maketform('affine', [C d; 0 0 1]');
    Im2 = imtransform(redChannel, tform);
    subplot(2, 3, 5); 
    imshow(Im2);
于 2012-04-11T17:55:04.043 に答える