web-dev-qa-db-ja.com

Voluson 4D超音波スキャン(.V00ファイル)をビデオに変換するにはどうすればよいですか?

GE Healthcare Voluson のマシンで作成された「4Dボリュームシネ」超音波スキャン(3Dスキャンの時系列)があります。ファイルは古い独自仕様の.V00 フォーマット。

これから通常のメディアプレーヤーで再生できるビデオファイルを作成したいと思います。理想的には無料で入手できるツールを使用して、それを行う方法は?

1
tanius

.V00ファイルは、「Kretzfile」/「Kretz3D超音波画像」形式[ ソース ]です。 GE HealthcareとKretzの関係は、「2001年にGE MedicalSystemsがMedisonからKretztechnikAGの主要な株式を取得し、KretztechnikAGがGEMedical Systemsの完全子会社になった」ためです[ 出典 ]。

使用できます 4Dビューこれは、GEHealthcareがVoluson超音波イメージングマシン用に提供する「公式」PCソフトウェアです。それを使用してビデオにエクスポートする方法のプロセス例:

  1. ファイルを4Dビューで開き、[ファイル]→[4DImg。シネシーケンスのエクスポート...]を選択します。
  2. オプション「圧縮」にチェックマークを付けます(ステップ4で後処理が必要な場合を除き、圧縮を使用して バグ を防止しないでください)。 「縮小率」は「1.00:1」のままにします。そうしないと、ビデオ解像度がダウンスケールされます。
  3. 「保存」をクリックして、4Dボリュームを.avi形式にエクスポートします。あなたが得るものは 4Dビューで再生 のように見えるはずです、ちょうどすべてのレタリングなしで。
  4. ビデオから巨大な黒い境界線を削除し、エクスポートされた複数のビデオを接続し、すべてを小さなMP4形式に変換するには、Linuxシェルで次の ffmpeg コマンドを実行できます。エクスポートされた、圧縮されていない.aviファイルだけが含まれているディレクトリにいる間:

    ffmpeg \
      -i concat:"$(ls -l *.avi | awk 'BEGIN {ORS="|"} { print $9 }')" \
      -filter:v "crop=400:380:332:175" \
      -r 25 \
      -crf 18 \
      output.mp4
    

    これは いくつかその他回答 に基づいています。代わりに avconv がある場合は、同じパラメーターで機能します。 x = 332、y = 175で始まる400×380ピクセルのコンテンツ(つまり、約1068×740ピクセルのビデオを中心とする)を想定しています。必要に応じて、静止フレームで測定することにより、crop=パラメータ値をケースに適合させます。 。 -crf 18は、デフォルトの-crf 23よりも高い品質を選択しますが、ファイルサイズが大きくなります。品質の向上が見られるかどうかは疑問ですが…

  5. アーカイブの目的で、個々のAVIビデオ(圧縮されていない場合は巨大です!)を連結せずに、ニースのロスレスまたはほぼロスレスの形式で保存し、無駄な黒い境界線を削除することをお勧めします。

    for file in *.avi; do
      ffmpeg \
        -i $file \
        -c:v libx264 \
        -preset veryslow \
        -crf 1 \
        -r 25 \
        -filter:v "crop=400:380:332:175" \
        ${file/.avi/.mp4};
    done
    

    これは、量子化値1(-crf 1)のH.264を使用します。これは、ロスレス[ source ]に非常に近く、元の非圧縮AVIの25分の1です。代わりに-crf 0以上の-qp 0を使用することもできます。これにより、真にロスレスのH.264が得られます。それは約20%大きく、すべてのプレイヤーがそれを読むことができるわけではありません[ 詳細 ]。しかし、VLCとYouTubeは、たとえばできます。

4Dビューの取得とインストールに関するヒント:

  • 4D Viewは、ライセンスソフトウェア、60日間の無制限のデモバージョン、および有効期限が切れていない機能解除バージョンとして利用できます[ 参照 ]。すべてが.aviファイルにエクスポートできるようですが、私は60日間のデモでしか試しませんでした。
  • 新しいバージョンの4DViewは、Volusonマシンの登録所有者のみがダウンロードできます(サインアップしてマシンのシリアル番号を提供する必要がありますが、親切に尋ねると例外となる可能性があります)。ただし、以前のバージョンは一般にダウンロード可能であり、Web上で まだ利用可能 です。
  • 4DViewはWindows7用に作成されていますが、Windows XPなど)にもインストールできます。
  • 4D Viewは、仮想マシンでは使用できません。少なくとも、Windows XPゲスト(および3Dアクセラレーションが有効)のVirtualBoxでは使用できません)。起動しようとすると、4DViewは「十分なグラフィックがありません。カードが見つかったか、ドライバがインストールされていません」と終了します。

V00ファイルの変換に関する詳細と連絡先は このcomp.protocols.dicomスレッド にあります。背景情報については、 Voluson S6/S8サービスマニュアル もあります。テストのために、ここに見つけるのが難しい Kretzfile形式の3Dスキャン ダウンロード用;ただし、3Dのみであるため、4Dビューでの4Dから.aviへの変換は許可されません。

不可能: 4DTheFetusViewこのツールは2005バージョンの4D Viewと同じであり、引き続き無料でダウンロードできます。ただし、 sonoworld.com を介して共有されたデモボリュームを開くためにのみ使用できます。これらの4Dデモボリュームは、いくつかの それらのケースthisthisthis )に添付されていましたがダウンロードできなくなりました。

不可能: DICOMaticこれは無料でダウンロードできる変換ツールであり、多数の独自の医用画像フォーマットを新しいものに変換できます。標準フォーマット [〜#〜] dicom [〜#〜] 。未登録のバージョンがエクスポートされた画像に透かしを入れるというだけです[ ソース ]。 DICOMから、無料で利用できるツール MicroDICOM または DICOM Cine Viewer を使用して、ビデオファイルをエクスポートできます。ただし、GE KretzFile形式の場合、DICOMaticは、「DICOMは超音波画像の3Dボリュームをサポートしていません」[ ソース ]と述べています。 DICOMaticで.V00ファイルを開こうとすると、極座標をサポートしていないというメモが表示されました。おそらくそれは、3Dボリュームがサポートされていない(?)と言っているのと同じです。したがって、(私にとっては)機能しませんでしたが、製造元は機能するはずだと言っています[ ソース ]。

不可能: TomoVision およびスクリーングラバー。TomoVisionは医用画像形式のビューアであるため、.V00シーケンスをレンダリングできる場合、スクリーングラバーでビデオに変換することができます。ただし、DICOMatic [ source ]と同じライブラリを使用しているため、4Dボリュームを読み取ることもできません。繰り返しになりますが、メーカーはそれが可能であるはずだと主張しています[ ソース ]。

3
tanius

3DSlicerにGE/Kretz3D超音波画像リーダーを実装しました。画像を読み込んだ後、3Dスライサーのすべてのすばらしいツールを使用して画像を視覚化および処理できます(たとえば、3D印刷可能なモデルを作成するため)。ここでデモを見ることができます:

https://youtu.be/UHq0uyDvhaA

まだ完全ではありませんが(球形からデカルト座標への変換は完全には正確ではありません)、完全に無料でオープンソースです。修正と改善を歓迎します。詳細と質問については、3Dスライサーフォーラムに投稿してください。

https://discourse.slicer.org/t/loading-of-ge-kretz-ultrasound-volumes-vol-file/808/14?u=lassoan

1
Andras Lasso

圧縮を有効にせずに(ウェーブレット= 'オフ')、ボリューム/未加工ファイルを選択してVolusonファイルをエクスポートしたと仮定して...このスクリプトを使用して、データがサードパーティのDICOM形式であるかどうかを確認してください。これは、データを使用可能な形式に再構築しませんが、要素データにアクセスできるかどうかを示します。

import struct
import sys

class GETagAnalyser(object):

def __init__(self,fname):
    self.m_fname = None
    if fname is not None:
        self.m_fname = fname
    self.m_tagdict = [] 

def readAllTags(self):
    with open(self.m_fname,'rb') as f:
        hdr = f.read(16)
        print hdr
        #find end
        f.seek(0,2)    
        fend = f.tell()
        print fend
        #back to start
        f.seek(16,0) 
        while f.tell() <= fend-4:
            t1,t2,s,tag_data,f = self.readNextTag(f)    
            #self.m_tagdict                
            print hex(t1), hex(t2),s    
            #print t1, t2, s


def readNextTag(self,f):
    firsttag = f.read(2)
    firsttag = struct.unpack('@H',firsttag)

    secondtag = f.read(2)
    secondtag = struct.unpack('@H',secondtag)

    size = f.read(4)
    size = struct.unpack('@I',size)    
    data = f.read(size[0])

    tag1,tag2,size,data = firsttag[0],secondtag[0],size[0],data
    return tag1,tag2,size,data,f

def main():

if len(sys.argv) != 2:
    print "Usage: GETagAnalyser <inputfile>"
    return
g = GETagAnalyser(sys.argv[1])
#print sys.argv[1]
g.readAllTags()
0
g.stevo