2017-02-14 35 views
2

我正在做計算機斷層掃描投影圖像的圖像處理。原始圖像是由CT機器輸出的.tiff輸出。我將它導入Matlab,在那裏處理它並使用imwrite()保存輸出圖像。隱藏的Matlab TIFF品牌?

我用來重建CT圖像的軟件是專有的,但支持從任何.tiff圖像重建,只要他們遵循一定的標準。顯然,Matlab不遵循這個標準,因爲它似乎將所有以某種方式保存的.tiff圖像加以標記。我可以通過將所有圖像加載到第三個軟件並再次保存來解決此問題,這似乎可以擦除標記並允許重建。這是非常乏味和耗時的,因爲我一天不得不多次做這件事。

我嘗試使用Matlab Tiff類加載'normal'和'scrubbed'.tiff。我手動查看了結構中的所有字段,並且找不到任何區別,但另一個不會加載到CT程序中,另一個很好。

有沒有一種隱藏的方式,Matlab不知何故品牌這些圖像?是否有可能在Matlab內擦洗這些圖像?

+2

作爲解決方法,** ImageMagick **將忽略或抑制不需要的TIFF標籤,並且您可以安排它在一個簡單的腳本中並行重寫多個TIFF圖像。此外,你可以使用它的'identify'程序來檢查你的文件,看看*品牌*是什麼 - 使用'identify -verbose someImage.tif',或者如果你有v7或更新的版本,用'magick ... ' –

+1

如果你安裝'libtiff' - 我使用** homebrew **在Mac上做的 - 你會得到一個名爲'tiffdump'的程序,它也會告訴你關於TIF文件的所有信息。 –

+2

如果專有軟件限制了您的研究,您總是可以選擇另一種選擇:開源。對於二維CT重建和三維重建(我認爲這是你的情況,因爲'.tif'),我相信很多免費軟件是ASTRA和TIGRE的好選擇。兩者都可以重建CT機器的圖像。免責聲明:我編程了TIGRE。 –

回答

3

我不能絕對確定,但它不太可能讓Matlab增加一個隱藏的品牌。

根據tiff格式標準,向tif文件添加隱藏品牌,不會導致tiff閱讀器軟件失敗。

參考私人標籤部分:

開發人員可以申請「私人標籤」的方框,使他們能夠有一個TIFF文件中自己的專有信息不會引起問題的文件交換。 TIFF讀者需要,忽視了他們不認識的標籤,並註冊開發者的私有標籤保證不會與其他任何人的標籤或一組標準的規範中定義的標籤交鋒......

它看起來就像您使用的CT圖像軟件不符合tiff標準。

它可能(但不太可能)該軟件符合tiff的舊版本(版本5.0而不是版本6.0)。

失敗的一個原因可能是,Matalb創建了非常大的條帶,並且不遵循8K字節的建議。
參見https://www.itu.int/itudoc/itu-t/com16/tiff-fx/docs/tiff6.pdf:不推薦

一個單個條帶的用途。選擇RowsPerStrip,即使數據未被壓縮,每個帶也是大約8K字節的 ,因爲它爲讀者提供了更簡單的緩衝 。 「8K」值相當隨意,但似乎運作良好。

檢查下面的代碼(我已經發布here):

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

可能有很多其他的原因失敗,因爲TIFF格式是非常複雜的(尤其是從閱讀器側)。

+0

我試過你的代碼,它沒有幫助。我認爲你可能是對的,因爲這個問題出現在CT軟件的最後。 – Tapio

+0

其實是的。我發現另一個程序不能正確顯示imwrite() - 提示。我感到沮喪,並決定再試一次,並注意到我上次在代碼中犯了一個錯誤。使用上面的代碼(但將循環更改爲write())解決了問題,現在這兩個程序都能夠正確地與tiff進行交互。 – Tapio