Verfasst am: 14.07.2015, 21:01
Titel: uint16 zu uint8 wandeln
Guten Abend,
Ich möchte ein Tiff-Bild in Mathlab laden ( ein Graubild ) , welches allerdings immer als uint16 240x240 gelesen wird.
Um das Bild mit meinem Code bearbeiten zukönnen müsste es allerdings ein uint8 240x240x3 sein.
Jetzt habe ich hier das Problem, den Datentyp so zuändern, dass ich ein Graustufenbild in uint8 240x240x3 bekomme und nicht alles z.B. weis ist, weil ein Pixelwert im uint16 Bild z.B. 1872 beträgt und dann auf 255 gesetzt wird.
Über Hilfe würde ich mich freuen
P.S: Wenn ich das Bild mit image() ausgeben lasse als uint16 ist es Blau und Gelb
Verfasst am: 15.07.2015, 10:44
Titel: Re: uint16 zu uint8 wandeln
Hallo Reiswaffel,
Zitat:
Jetzt habe ich hier das Problem, den Datentyp so zuändern, dass ich ein Graustufenbild in uint8 240x240x3 bekomme
Graustufenbilder haben nur 2 Dinmensionen. Wieso möchtest Du ein a x b x 3 Array erzeugen?
Welchen Wert möchtest Du denn statt 1872 erhalten? Man könnte die Zahl durch 255 teilen, also auf 0-255 herunter skalieren. Oder wie Harald vorgeschlagen hat die Daten normalisieren, also den Bereich von 0 bis zum Maxiamlwert gleichmäßig auf 0-255 skalieren. Es gibt aber noch mehrere weitere Möglichkeiten.
Also vielen Dank erstmal für die Tipps, das mit dem Runterskalieren klappt auch soweit.
Allerdings befürchte ich, das dadurch die Farbgebung also die Grauabstufung von der Genauigkeit sehr beeinflusst wird, weil ja keine Kommazahlen angezeigt werden.
Zitat:
Wieso möchtest Du ein a x b x 3 Array erzeugen?
Theoretisch ist das ganze kein Problem, müsst halt ein paar Unterfunktionen anpassen, allerdings möchte ich später (soweit bin ich noch nicht) Umrisse erkennen und diese farbig darstellen.
zu den uint16 noch eine andere Frage, wie mache ich das genau mit der Colormap, dass das Bild mit wie das Origeniale Graustufenbild angezeigt wird und nicht Blau-Gelb ? Z.B. Colormap gray liefert nicht genau das Ergebnis sondern eher etwas schwarz-weises.
Allerdings befürchte ich, das dadurch die Farbgebung also die Grauabstufung von der Genauigkeit sehr beeinflusst wird, weil ja keine Kommazahlen angezeigt werden.
Während Dir klar ist, worum es hier geht, habe ich als Leser keine Ahnung, was Du genau meinst.
Zitat:
Zitat:
Wieso möchtest Du ein a x b x 3 Array erzeugen?
Theoretisch ist das ganze kein Problem, müsst halt ein paar Unterfunktionen anpassen, allerdings möchte ich später (soweit bin ich noch nicht) Umrisse erkennen und diese farbig darstellen.
Ich verstehe nicht, worum es hier geht.
Zitat:
zu den uint16 noch eine andere Frage, wie mache ich das genau mit der Colormap, dass das Bild mit wie das Origeniale Graustufenbild angezeigt wird und nicht Blau-Gelb ? :?: Z.B. Colormap gray liefert nicht genau das Ergebnis sondern eher etwas schwarz-weises.
Bitte poste den bisherigen Code und stelle eine konkrete Frage dazu. Man kann nur schwer einen verbesserungsvorschlag machen, wenn man nicht sieht, wie Du genau zu einem "Blau-Gelb-Bild" kommst.
Das unbearbeitete Bild habe ich als " Kreis mit Spitze " angehängt, das Bild, welches mir durch image() ausgegeben wird, als "Kreis mit Spitze geladen".
Mir ist aufgefallen, dass wenn ich das Bild wieder speichere, das Bild ganz normal abgespeichert wird.
Desweiteren besteht ja noch das Problem, dass ich in dem Bild später z.B. die Umrisse Rot darstellen will und deswegen ein uint8 bräuchte. Das Beispielbild wird als uint16 ( Graubild ) geladen.
Hierzu habe ich mir folgenden Umweg gedacht ,als Beispiel mal nur für ein Bild jetzt
GrauB=SchwarzBild; % SchwarzBild wird später nochmal benötigt
GrauB(:,:,1)=Bload{1}(:,:); % Jeden Farbwert des Schwarzbildes auf den Grauwert des Bildes setzen damit Graubild als uint8 entsteht
GrauB(:,:,2)=Bload{1}(:,:);
GrauB(:,:,3)=Bload{1}(:,:);
Diese Code wandelt mir mein uint16 Bild in ein uint8 Graustufenbild, hier zu wird ein bereits gespeichertes uint8 SchwarzBild auf die Größe zugeschnitten und dann den Pixel ein neuer Wert zugewiesen.
Allerdings, geht mir in dem uint8 Bild viele Informationen verloren, weil uint8 ja keine Kommazahlen angibt.
Ich hoffe die Problematik ist jetzt verständlicher
LG Reiswuffel
Kreis mit Spitze geladen.tif
Beschreibung:
So sieht das Bild aus, wenn ich es mir mit image() anzeigen lassen
wenn der Informationsgehalt von uint16 (2^16 Möglichkeiten) auch nur annähernd ausgenutzt wurde, dann gibt es keine Möglichkeit einer eineindeutigen Abbildung auf uint8 (2^8 Möglichkeiten).
Anders gesagt: wenn in den ursprünglichen Daten nicht gerade zufällig nur 2^8 verschiedene Werte auftreten, dann ist eine Überführung in uint8 ohne Informationsverlust unmöglich.
also muss ich zum Highlighten der Umrisse mit Farbe den Informationsverlust in Kauf nehmen
Für die Umwandlung gibt es allerdings keine Funktion oder ? ( also habe zu mindest keine gefunden) , weil wäre schon schöner wenn ich nicht meine dahin gebastelte 0815 Lösung verwenden müsste
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.