WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

uint16 zu uint8 wandeln

 

Reiswaffel
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.07.2015, 21:01     Titel: uint16 zu uint8 wandeln
  Antworten mit Zitat      
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 Smile
P.S: Wenn ich das Bild mit image() ausgeben lasse als uint16 ist es Blau und Gelb Shocked
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.484
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.07.2015, 22:04     Titel:
  Antworten mit Zitat      
Hallo,

dann teile doch z.B. durch den Maximalwert und multipliziere mit 255?

Grüße,
Harald

P.S. Das liegt an der Farbgebung, änderbar über colormap .
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.07.2015, 10:44     Titel: Re: uint16 zu uint8 wandeln
  Antworten mit Zitat      
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Reiswaffel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.07.2015, 08:45     Titel:
  Antworten mit Zitat      
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.

Question 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 ? Question Z.B. Colormap gray liefert nicht genau das Ergebnis sondern eher etwas schwarz-weises.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.07.2015, 12:39     Titel:
  Antworten mit Zitat      
Hallo Reiswaffel,

Zitat:
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Reiswaffel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.07.2015, 19:41     Titel:
  Antworten mit Zitat      
Hast Recht, tut mir Leid

Also der abgespeckte Code ( hier tritt bereits das Problem auf )
Einfach nur Bilder laden und anzeigen

Code:

Bstruc=dir('...\*tif');

for k=1:numel(Bstruc)
    Bload{k}=imread(Bstruc(k).name);
end

image(Bload{1});
imwrite(Bload{1},'Kreis mit Spitze geladen.tiff');
 


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 Very Happy ,als Beispiel mal nur für ein Bild jetzt

Code:

Bstruc=dir('...\*tif');

Bload{1}=imread(Bstruc(1).name);
Bload{1}=double(Bload{1}); % wandelt Bild in double, damit die Kommerstellen erhalten bleiben

maximum=max(Bload{1}(:)); % Maximalen Grauwert des Bildes bestimmen

Bload{1}=(Bload{1}./maximum).*255; % Grauwert auf eine 255 Skale anpassen

addpath(genpath('...\SchwarzBild'));
Schwarz=imread('Schwarz.png'); % Vergleichs Schwarzbild laden

sz=size(Bload{1});
SchwarzBild(1:sz(1),1:sz(2),:)=Schwarz(1:sz(1),1:sz(2),:); % Schwarzbild zuschneiden

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 Smile
LG Reiswuffel

Kreis mit Spitze geladen.tif
 Beschreibung:
So sieht das Bild aus, wenn ich es mir mit image() anzeigen lassen

Download
 Dateiname:  Kreis mit Spitze geladen.tif
 Dateigröße:  19.38 KB
 Heruntergeladen:  544 mal
Kreis mit Spitze.tif
 Beschreibung:
Beispiedatei vor dem Bearbeiten

Download
 Dateiname:  Kreis mit Spitze.tif
 Dateigröße:  427.73 KB
 Heruntergeladen:  496 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Reiswaffel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.07.2015, 17:36     Titel:
  Antworten mit Zitat      
okay, das erste Problem mit der Darstellung des Bildes durch den Befehl images() konnte ich lösen.

Code:

Bstruc=dir('...\*tif');

for k=1:numel(Bstruc)
    Bload{k}=imread(Bstruc(k).name);
end

image(Bload{1});
colormap(gray(max(Bload{1}(:)));

 


Durch colormap mit einer Graustufung bis zum maximalen Wert des Bildes.

Weiß noch jemand was bezüglich der Umwandlung von uint16 in uint8 ? ( siehe Post oben drüber)

Danke.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.484
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.07.2015, 17:45     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Reiswaffel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.07.2015, 17:52     Titel:
  Antworten mit Zitat      
Danke für die Antwort,

also muss ich zum Highlighten der Umrisse mit Farbe den Informationsverlust in Kauf nehmen Confused

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 Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.