2016-09-13 4 views
0

私はビデオの解析を使って魚の泳ぎに関する研究に取り組んでいます。そして、尾部に重点を置いて画像(ビデオフレームから得られた画像)を注意深く調べる必要があります。バイナリ画像の滑らかでぴったりなエッジ

イメージは高解像度であり、私がカスタマイズしたソフトウェアはバイナリイメージで動作します。これは簡単に数学演算を行うためです。

1)ほとんど何もして、後でBW比、最終的に私にこのような画像を与えるtresholdでバイナリに、色を反転、画像がグレーに変換します。私は2つの方法を使用して、このバイナリイメージがobtenについては

ノイズの画像は、カットのために、私はこのコードを使用) image 1

2境界を(今は確定のための尾移動の振幅をよりacurracyを必要とする)ときには領域のビットを喪失し、尾部と非常に正確でありませんしきい値を増やして、これは私にエッジの良いイメージを与えますが、私はこれらのポイントと滑らかな画像、またはフィッティングバイナリイメージのようなことを知っていない、matlab 2012Rbのアプリケーションフィッティングは私に良いグラフを与えていないと、 MATLABのツールボックスにアクセスできます。

s4 = imread('arecorte.bmp'); 
A=[90 90 1110 550] 
s5=imcrop(s4,A) 
E = edge(s5,'canny',0.59); 

image2

私の質問は、私は、二値画像や関節のポイントに合うとせずに尾を乱すスムーズにすることができますどのように

ということでしょうか?

またはどのように画像2のエッジを使用して画像1の鮮鋭度を上げることができますか?

私はもっと多くのリンクを投稿することができないので、方法2)の考えを与えるコメントに画像をアップロードします。繰り返しで作業しており、フレームごとに作業できないことを忘れないでください。

注:これは私が死んでいる点にあり、これを行うために誰かに支払うためのリソースがないためです。この瞬間までにコードを書くことができましたが、この最終的な問題では単独ではできません。

+0

http://i.stack.imgur.com/6hmSe.jpg – JVidal

+0

これは、白黒画像ではなく、グレースケール画像用のアルゴリズムである、鋭いエッジ検出器を使用しないでください。 'bwperim'を使用してください。http://uk.mathworks.com/help/images/ref/bwperim.html –

+0

それには尾部が含まれていない場合は、最初に同じカーネルで画像を膨張させて腐食させてください。 https://uk.mathworks.com/help/images/morphological-dilation-and-erosion.html –

答えて

0

は、私はあなたがラベルが各パートのピクセルを取得するために、境界抽出連結成分lablingを使用し、小さなラベルを破棄し、よりべきだと思い

コード:

clear all 

% Read image 
I = imread('fish.jpg'); 

% You don't need to do it you haef allready a bw image 
Ibw = rgb2gray(I); 
Ibw(Ibw < 100) = 0; 

% Find size of image 
[row,col] = size(Ibw); 

% Find connceted components 
CC = bwconncomp(Ibw,8); 

% Find area of the compoennts 
stats = regionprops(CC,'Area','PixelIdxList'); 
areas = [stats.Area]; 

% Sort the areas 
[val,index] = sort(areas,'descend'); 

% Take the two largest comonents ids and create filterd image 
IbwFilterd = zeros(row,col); 
IbwFilterd(stats(index(1,1)).PixelIdxList) = 1; 
IbwFilterd(stats(index(1,2)).PixelIdxList) = 1; 
imshow(IbwFilterd); 

% Find the pixels of the border of the main component and tail 
boundries = bwboundaries(IbwFilterd); 

yCorrdainteOfMainFishBody = boundries{1}(:,1); 
xCorrdainteOfMainFishBody = boundries{1}(:,2); 
linearCorrdMainFishBody = sub2ind([row,col],yCorrdainteOfMainFishBody,xCorrdainteOfMainFishBody); 

yCorrdainteOfTailFishBody = boundries{2}(:,1); 
xCorrdainteOfTailFishBody = boundries{2}(:,2); 
linearCorrdTailFishBody = sub2ind([row,col],yCorrdainteOfTailFishBody,xCorrdainteOfTailFishBody); 

% For visoulaztion put color for the boundries 
IFinal = zeros(row,col,3); 
IFinalChannel = zeros(row,col); 

IFinal(:,:,1) = IFinalChannel; 

IFinalChannel(linearCorrdMainFishBody) = 255; 
IFinal(:,:,2) = IFinalChannel; 

IFinalChannel = zeros(row,col); 
IFinalChannel(linearCorrdTailFishBody) = 125; 
IFinal(:,:,3) = IFinalChannel; 
imshow(IFinal); 

最終画像: enter image description here

+0

答えをありがとう! 私が実行すると、matlabに "インデックス(1,2)にアクセスしようとしましたが、numel(index)= 1であるためインデックスを越えています"というメッセージが表示されます。と私は気づいたCC.NumObjects = 1私は "<" to ">"からコードを実行し、問題なしでコードが実行されます 私は多くの画像を試し、_bwbwlabel_画像メソッドと比較して、尾の位置は非常に正確です!しかし、私は問題を抱えています。コードは、すべての状況で非常にうまく動作しません。このような「ほぼ1つの領域」(http://imgur.com/a/rNaVe)のように見える画像は、悪い表現(http://imgur.com/a/0DZRg) – JVidal

+0

今私は私のコードの数学演算を使用するためのイメージを埋める必要があります(imfill(_ 'holes')を使って) 'and' orientation ')、 どのようにすべての状況で正常に動作するコードを修正できますか?距離チェック?画像の反対側にはほとんどすべてのノイズが現れますが、このコードでは最悪のケースです。この問題を解決し、1000個の画像で実行して結果を共有することができます。Dあなたには非常に感謝しています。 – JVidal

+0

表記については、領域をズームして見ましたか?理由は、それが不完全に見える理由は、おそらく、図の解像度のためですが、ズームすれば、それは良いと思うと思うでしょう –

関連する問題