7

私はコードを書こうとしています。これは私の生物学の仕事に役立ちます。コードの概念は、組織内の収縮細胞のビデオファイルを分析することです

例1

例2:youtube.com/watch?v=uG_WOdGw6Rk

そして、以下をプロットします。

  1. 1分あたりのビート数。
  2. ビートの強さ
  3. 殴打の規則性

そこで、ビデオをループして各フレームとそれに続くフレームを比較し、フレームに変更があったかどうかを確認して、これらの変更を曲線にプロットするMatlabコードを作成しました。

私のコード結果の例 ここに画像の説明を入力してください

私が書いた現在のコードのコア:

for i=2:totalframes
        compared=read(vidObj,i);
        ref=rgb2gray(compared);%% convert to gray
        level=graythresh(ref);%% calculate threshold
        compared=im2bw(compared,level);%% convert to binary        
        differ=sum(sum(imabsdiff(vid,compared))); %% get sum of difference between 2 frames
        if (differ ~=0) && (any(amp==differ)==0) %%0 is = no change happened so i dont wana record that !
            amp(end+1)=differ;  % save difference to array amp wi
            time(end+1)=i/framerate; %save to time array with sec's, used another array so i can filter both later.
            vid=compared; %% save current frame as refrence to compare the next frame against.
        end
end
figure,plot(amp,time);

=====================

これが私のコードですが、より良い結果を得ることができるようにそれを改善する方法はありますか?

私のビデオにはたくさんのノイズが含まれていて、結果に多くの影響を与えるため、imabsdiffが正確に使用すべきものではないことに気づき、すべてのアンプデータが実際に偽造されていると思います!

また、実際には、ピークを数えることによって、これからビート率を抽出することしかできませんが、必要なすべてのデータを取得できるようにコードを改善するにはどうすればよいですか?

また、本当にありがとうございました。これはコードのごく一部です。さらに情報が必要な場合は、お知らせください。ありがとう

4

3 に答える 3

9

あなたは「単純なコード」を書き込もうとしていると言いますが、これは実際には単純な問題ではありません。モーションを正確に測定する場合は、オプティカルフローアルゴリズムを使用するか、登録アルゴリズムから変形フィールドを確認する必要があります。

編集:マットが言っているように、そしてあなたの曲線からわかるように、あなたの方法は拍数と規則性を抽出するのに適しています。ただし、ビートの強さを正確に見つけるには、セルの動きを計算する必要があります(動きが多い=ビートが強い)。残念ながら、これは簡単なことではありません。そのため、動きを計算できる2つのアルゴリズムへのリンクを提供しました。

于 2012-02-07T10:18:32.720 に答える
4

ビデオで見られる構造は何ですか?たとえば、画像の下部にある大きな暗いオブジェクトは何ですか?このオブジェクトは比較的簡単に追跡できますが、このオブジェクトからのデータは、細胞の収縮に関するデータを取得するのに関連しますか?

この画像は軽い顕微鏡からのものですか?どの倍率で?スケールは何ですか?ビデオから、いくつかの動きと動きの領域があるように見えます。それで、あなたはあなたの測定値を得るために、より小さなまたはより大きな領域に焦点を合わせるべきですか?細胞あたりの収縮または領域の収縮?経験から、顕微鏡で行うことを変更する方が、複雑な画像処理よりもはるかに優れている可能性があることを私は知っています;)

私は同様の問題でGunnとNixonsDualSnakeに成功しました: http ://citeseerx.ist.psu.edu/viewdoc/summary?doi = 10.1.1.64.6831

最初の近似を手作業で最初のフレームに配置し、セグメンテーション結果を次のフレームの開始曲線として使用しました。これに対する私の実装は2000年のもので、紙にしかありませんが、GunnとNixonsの紙がおもしろいと思ったら、おそらく私のコードを見つけてスキャンすることができます。

@Mattは、結果を改善するためにスムージングとエッジ検出を提案しました。これは良いアドバイスです。スムージング、しきい値処理、およびエッジ検出を1つの関数呼び出しであるCannyエッジ検出器に組み合わせることができます。次に、エッジをダイヤルして、フレーム間のオーバーラップを大きくすることができます。オーバーラップが少ないということは、おそらくフレーム間の大きな動きを意味します。これを以前と同じ方法で使用して、ビートを見つけることができます。これで、2番目のパスを作成し、1つのビートに関連するすべてのダイヤルされたエッジ画像を追加できます。これにより、細胞が収縮を介して移動するときに細胞がトレースする領域についてのアイデアが得られるはずです。たぶん、これは細胞の大きなクラスターの収縮のための有用な手段として使用することができます。

現在、MatlabとImage Processing Toolboxにアクセスできないため、テスト済みのコードを提供できません。ここにいくつかのヒントがあります:http://www.mathworks.se/help/toolbox/images/ref/edge.html、http://www.mathworks.se/help/toolbox/images/ref/imdilate.htmlおよびhttp ://www.mathworks.se/help/toolbox/images/ref/imadd.html。

于 2012-02-12T19:02:15.930 に答える
4

それを試すためのいくつかのかなり簡単なことが役立つかもしれません:

  • 私はあなたのしきい値処理が何をしているのか、そしてそれが本当にあなたがやりたいことなのかどうかを詳細に調べます。グレイスレッシュが正確に何をするのかはわかりませんが、同じピクセル値に区別したいさまざまな機能をひとまとめにしている可能性があります。しきい値を設定せずに画像間の差異をプロットしてみましたか?または、白黒だけでなく、複数のクラスにしきい値を設定することもできます。
  • ノイズが主な問題である場合は、差をとる前に画像をスムージングしてみてください。そうすれば、ノイズの差は均等になりますが、動きに起因する大きな特徴の差は残ります。
  • 違いをとる前に、画像のエッジ検出を試すことができます。

前の回答者が述べたように、画像が異なるかどうかだけでなく、各画像間の実際の動きを推定するモーショントラッキングおよび登録アルゴリズムを調べることもできます。これはウィキペディアのまともな要約だと思います:http://en.wikipedia.org/wiki/Video_tracking。しかし、それらはかなり複雑になる可能性があります。

ただし、収縮の時間と期間を見つけるだけでよい場合は、必ずしも詳細なモーショントラッキングや画像間の変形可能な位置合わせを行う必要はないと思います。知っておく必要があるのは、それらがいつ大幅に変化するかだけです。(収縮の「強さ」は別の問題です。厳密に定義するには、実際に起こっている動きを知る必要があるでしょう。)

于 2012-02-10T17:38:01.993 に答える