2012-04-05 10 views
2

楕円形のオブジェクトを円で描くまで伸ばす必要があります。私のプログラムは、現在、楕円形のオブジェクト(例えば、角度を付けてコイン)を画像に入力し、閾値を設定して二値化し、エッジ検出/境界線を使って関心領域を分離し()、regionprops() 。画像内の楕円を伸ばして円を描く

本来、「MajorAxisLength」を直径として使用し、短軸上のオブジェクトを伸ばして円を形成したいとします。どのように私がこれにアプローチすべきかについての提案は非常に高く評価されるだろう。私はあなたの見解のためにいくつかのコードを追加しました(残念ながら、画像をアップロードするのに十分な評判はなく、黒い背景に白い楕円のように見えます)。

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

コードスニペット:

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

答えて

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

あなたは円の直径を知っているし、あなたはセンターがメジャーとマイナーの軸が交差する場所である知っています。したがって、直径から半径を計算し、画像内のすべてのピクセルについて、そのピクセルのユークリッド距離が、Cirlceの中心から未満であるかどうかを確認してください。その場合は、ピクセルを白色に色付けします。それ以外の場合は、そのままにしておきます。

[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を使用してoptimzedすることができます。

+0

EMS、もう一度お返事ありがとうございます。ちょっと微調整して、2値化された画像でうまくいきました。しかし、イメージのグレースケールバージョンを伸ばすためにコードを修正できる方法があるかどうかは疑問でした。ストレッチが元のイメージにどのような影響を与えているのかを調べ、白いピクセルで塗りつぶすことでそれが妨げられることがあります。 – mg6011

+0

私は参照してください。だからあなたは与えられた既知の楕円を取ってそれを長軸に等しい直径の円に写像するアフィン変換を探しています。私は私の頭の上から見える変換行列がどのように見えるか分かりませんが、標準的なテキストのどこかにリストされたよく知られた結果であるように思えます。次に、その変換行列を使用して、画像の元の座標を新しい座標にマッピングします。それは画像の端の周りのものをカットするかもしれませんが、楕円を円に膨らませるべきです。 – ely

+0

はい、アファイン変換は、私が到着したのとほぼ同じ結論でした。つまり、適切な変換行列を定式化することです。私はしつこい続けるつもりです。 – mg6011