2017-02-14 4 views
2

私はコンピュータ断層撮影投影画像の画像処理を行っています。元の画像は、CTマシンによる.tiff出力です。 Matlabにインポートして、imwrite()を使って出力イメージを処理して保存します。隠されたMatlab TIFFブランド?

私がCT画像を後で再構成するのに使用しているソフトウェアは独自のものですが、特定の標準に従う限り、.tiff画像からの再構成をサポートしています。どうやらMatlabはこの標準に従いません。なぜなら、何らかの方法で保存するすべての.tiffイメージをブランド化するように見えるからです。すべての画像を3番目のソフトウェアで読み込んで保存すると、タグを消去して再構築できるようになります。これは、私が一日に複数回それをやらなくてはならないので、退屈で時間がかかります。

私はMatlab Tiff-classを使って 'normal'と 'scrubbed' .tiffの両方をロードしようとしました。私は手動で構造体のすべてのフィールドを通過し、他のものはCTプログラムにロードされず、もう一方は問題ありませんが、違いは見つかりませんでした。

Matlabがどういうわけかこれらの画像をブランド化する隠された方法はありますか? Matlab内でこれらの画像をスクラブすることは可能ですか?

+2

回避策として、** ImageMagick **は不要なTIFFタグを無視または抑制し、複数のTIFF画像を簡単なスクリプトで並列に書き直すようにスケジュールすることができます。また、 'identify'プログラムを使ってあなたのファイルを検査し、* branding *が何であるかを見ることができます - ' identify -verbose someImage.tif'を使うか、v7以上を持っていれば 'magick ... ' –

+1

** homebrew **を使ってMac上で実行する' libtiff'をインストールすると、 'tiffdump'という名前のプログラムが得られます。このプログラムはTIFファイルについて知りたいことをすべて伝えます。 –

+2

プロプライエタリなソフトウェアがあなたの研究を制限しているものなら、あなたはいつも別の選択肢があります:オープンソース。 ASTRAとTIGREは、2D CTの再構築や3D再構成(私はこれがあなたのケースであると仮定します)のために、かなりのフリーソフトウェアがたくさんあります。どちらもCTマシンから画像を再構成できます。免責事項:私はTIGREをプログラミングしました。 –

答えて

3

私は絶対に確信することはできませんが、Matlabが隠しブランドを追加することはほとんどありません。

tiff標準規格によれば、隠しブランドをtifファイルに追加しても、TIFFリーダーソフトウェアが失敗することはありません。

開発者は、ファイル交換のために問題を生じさせることなく、TIFFファイル内の自身の専有情報が含まれるように、それらを有効にするには、「プライベートタグ」のブロックを申請することができます:

プライベートタグにセクションを参照してください。

はそれが見えます... TIFF読者は、彼らが認識しないタグを無視する必要があり、登録開発者のプライベートタグは、他人のタグまたは仕様で定義されたタグの標準セットと衝突しないことが保証されています使用しているCT画像ソフトウェアのように、tiff標準に準拠していません。

ソフトウェアが古いリビジョンのtiff(リビジョン6.0ではなくリビジョン5.0)に準拠している可能性があります。

Matalbは非常に大きなストリップを作成し、8Kバイトの推奨に従わないことが原因の1つです。
https://www.itu.int/itudoc/itu-t/com16/tiff-fx/docs/tiff6.pdfを参照してください:単一のストリップの

使用は推奨されません。データが圧縮されていなくても、各ストリップが約8Kバイトの になるようにRowsPerStripを選択してください。これにより、バッファリングがより簡単になるため、読者には となります。 "8K"の値はかなり恣意的ですが、うまくいくようです。

は(私はhereを掲載している)次のコードをチェックしてください:TIFF形式が非常に複雑になるので

%Simulate large image (to be saved as tiff later) 
I = imread('peppers.png'); 
I = repmat(I, [4, 4]); 

t = Tiff('I.tif', 'w'); 

width = size(I, 2); 
height = size(I, 1); 
rows_per_strip = 1; %Select 1 row per strip (assume image row is less then 8K bytes). 

setTag(t, 'ImageLength', height) 
setTag(t, 'ImageWidth', width) 
setTag(t, 'Photometric', Tiff.Photometric.RGB) 
setTag(t, 'BitsPerSample', 8) 
setTag(t, 'SamplesPerPixel', 3) 
setTag(t, 'RowsPerStrip', rows_per_strip) 
setTag(t, 'PlanarConfiguration', Tiff.PlanarConfiguration.Chunky) 
%setTag(t, 'Compression', Tiff.Compression.LZW) 
setTag(t, 'Compression', Tiff.Compression.None) %Try without compression 

n_strips = ceil(height/rows_per_strip); %Total number of strips. 

h = waitbar(0, 'In process'); 

%Write the tiff image strip by strip (and advance the waitbar). 
for i = 1:n_strips 
    y0 = (i-1)*rows_per_strip + 1; %First row of current strip. 
    y1 = min(y0 + rows_per_strip - 1, height); %Last row of current strip. 
    writeEncodedStrip(t, i, I(y0:y1, :, :)) %Write strip rows y0 to y1. 
    waitbar(i/n_strips, h); %Update waitbar. 
    drawnow %Force GUI refresh. 
end 

close(t) 
close(h) 

(特に読者の側から)、失敗の他の多くの理由があるかもしれません。

+0

私はあなたのコードを試しましたが、それは助けにはなりませんでした。私は、問題がCTソフトウェアの終わりにあるという点で、おそらく正しいと思います。 – Tapio

+0

実際にそうでした。私はimwrite()-tiffsを正しく表示しない別のプログラムを見つけました。私は不満を持ち、これをもう一度試してみることにしました。最後にコードを間違えてしまったことに気付きました。上記のコードを使用して(ただし、ループをwrite()に変更する)問題が解決され、両方のプログラムがtiffと適切に対話できます。 – Tapio

関連する問題