2017-02-14 5 views
2

Ich mache Bildverarbeitung auf Computertomographie-Projektionsbildern. Das Originalbild ist eine TIFF-Ausgabe der CT-Maschine. Ich importiere es nach Matlab, wo ich es verarbeite und das Ausgabebild mit imwrite() speichere.Versteckte Matlab TIFF Marke?

Die Software Ich benutze die CT-Bilder zu rekonstruieren, danach proprietär ist, sondern unterstützt den Wiederaufbau von allen Tiff Bilder, solange sie einen gewissen Standard folgen. Anscheinend folgt Matlab nicht diesem Standard, da es scheint, alle tiff-Bilder zu brandmarken, die irgendwie gespeichert werden. Ich kann es umgehen, indem ich alle Bilder mit einer dritten Software lade und sie wieder speichere, was das Tag zu löschen scheint und Rekonstruktion ermöglicht. Dies ist mühsam und zeitraubend, da ich es mehrmals am Tag tun müsste.

I versucht das Laden sowohl eine ‚normale‘ und eine ‚geschrubbt‘ Tiff durch -Klasse der MATLAB Tiff verwenden. Ich habe alle Felder in der Struktur manuell durchsucht und konnte keinen Unterschied feststellen, obwohl der andere nicht in das CT-Programm geladen wird und der andere in Ordnung ist.

Gibt es eine versteckte Möglichkeit, dass Matlab diese Bilder irgendwie brandmarkt? Ist es möglich, diese Bilder in Matlab zu scrubben?

+2

Als Umgehung ignoriert ** ** ImageMagick ** unerwünschte TIFF-Tags oder unterdrückt sie, und Sie können planen, mehrere TIFF-Bilder parallel in einem einfachen Skript zu schreiben. Sie können auch das 'identify' Programm verwenden, um Ihre Dateien zu untersuchen und zu sehen, was das * branding * ist - verwenden Sie' identify -verbose someImage.tif', oder wenn Sie v7 oder neuer haben, setzen Sie diesen Befehl mit 'magick ... ' –

+1

Wenn Sie' libtiff' installieren - was ich auf einem Mac mit ** homebrew ** mache - erhalten Sie ein Programm mit dem Namen 'tiffdump', das Ihnen alles sagt, was Sie schon immer über TIF-Dateien wissen wollten. –

+2

Wenn proprietäre Software Ihre Forschung einschränkt, haben Sie immer eine andere Option: Open Source. Es gibt ziemlich viel freie Software für die 2D-CT-Rekonstruktion und für die 3D-Rekonstruktion (ich nehme an, dies ist dein Fall, weil ".tif"). ASTRA und TIGRE sind, glaube ich, großartige Optionen. Beide können Bilder von CT-Maschinen rekonstruieren. Haftungsausschluss: Ich habe TIGRE programmiert. –

Antwort

3

Ich kann nicht absolut sicher sein, aber es ist sehr unwahrscheinlich, dass Matlab eine versteckte Marke hinzufügt.

Nach tiff Format-Standard, Hinzufügen einer versteckten Marke, tif Datei, wird nicht dazu führen, dass eine TIFF-Reader-Software fehlschlagen.

Siehe Privat Tags Abschnitt:

Entwickler für einen Block von „privaten Tags“ anwenden können, damit sie ihre eigenen proprietären Informationen in einer TIFF-Datei für Datei Austausch ohne Probleme aufzunehmen. TIFF-Leser sind erforderlich, um Tags zu ignorieren, die sie nicht kennen, und registrierter Entwickler Private-Tags sind nicht garantiert mit jemand anderem Tags oder mit dem Standardsatz von Tags in der Spezifikation definiert kollidieren ...

Es sieht Wie die CT-Images-Software, die Sie verwenden, ist nicht konform mit dem TIFF-Standard.

Es könnte (aber unwahrscheinlich), dass die Software mit einer älteren Version von tiff (Revision 5.0 statt Revision 6.0) entspricht.

Ein Grund für das Scheitern könnte sein, dass Matalb sehr große Streifen schafft, und nicht der Empfehlung von 8K Bytes folgen.
Siehe https://www.itu.int/itudoc/itu-t/com16/tiff-fx/docs/tiff6.pdf:

Verwendung eines einzelnen Streifens wird nicht empfohlen. Wählen Sie RowsPerStrip so, dass jeder Streifen etwa 8K Bytes ist, auch wenn die Daten nicht komprimiert sind, da es das Puffern für Leser vereinfacht. Der "8K" -Wert ist ziemlich willkürlich, scheint aber gut zu funktionieren.

Überprüfen Sie den folgenden Code (ich habe here geschrieben):

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

Es gibt viele andere Gründe für das Scheitern sein könnte, weil TIFF-Format ist sehr kompliziert (vor allem von der Leseseite).

+0

Ich habe deinen Code ausprobiert, es hat nicht geholfen. Ich denke du hast wahrscheinlich Recht, dass das Problem in der CT-Software liegt. – Tapio

+0

Eigentlich ja. Ich habe ein anderes Programm gefunden, das die imwrite() -Tiffs nicht richtig anzeigt. Ich wurde frustriert und beschloss, dies erneut zu versuchen, und bemerkte, dass ich beim letzten Mal einen Fehler im Code gemacht hatte. Die Verwendung des obigen Codes (aber das Ändern der Schleife in ein write()) löste das Problem, und nun können beide Programme richtig mit den TIFFs interagieren. – Tapio