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

int16-Bilder auf z.B. int14 reduzieren

 

Magnus_11

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2018, 13:56     Titel: int16-Bilder auf z.B. int14 reduzieren
  Antworten mit Zitat      
Hallo allerseits,

ich habe ein Bild im int16 Format vorliegen und möchte zum Testen des Informationsverlusts die darin enthaltenen Grauwerte auf z.B. den int14 Bereich abbilden. Wie stelle ich das am Besten an?

Für uint16 Ausgangsformat und Umwandlung in uint8 ist ja die gängige Methode:
img_uint8 = uint8(img_uint16./256);

Gruß und Danke


Magnus_11

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2018, 11:13     Titel:
  Antworten mit Zitat      
Hat niemand eine Idee?
Für Vorschläge jeglicher Art wäre ich schon sehr dankbar!
Smile
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 22.06.2018, 11:49     Titel:
  Antworten mit Zitat      
Nun ja, es müsste ja ein "custom data type" angelegt werden bevpr man irgenwas konvertiert. Mit Fixed-Point Designer, bzw. den Vorgängerprodukten (Immer nach 'Fixed-Point' suchen) kann man für die Fixed-Point Arithmetic solche Datentypen anlegen. Ich kann mir vorstellen, dass es dann auch mit Interger geht. Gilt es zu prüfen - Fixed-Point Designer dürfte an den meisten Unis verfügbar sein.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.06.2018, 15:29     Titel: Re: int16-Bilder auf z.B. int14 reduzieren
  Antworten mit Zitat      
Hallo Magnus_11,

Du kannst einfach 2 Bits auf 0 setzen:
Code:
img = randi([0, intmax('uint16')], 10, 10, 'uint16');  % Test data
mask = uint16(bin2dec('1111 1111 1111 1100'));
img2 = bitand(img, mask)


Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Magnus_11

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2018, 08:28     Titel:
  Antworten mit Zitat      
Danke für Eure Rückmeldungen!
Ich werd' mal rumprobieren und mich dann wieder melden Wink
 
Magnus_11

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2018, 08:52     Titel:
  Antworten mit Zitat      
Hab da schonmal zwei Fragen.
Erstens:

Wenn ich das Beispiel auf meine Daten (int16) anwende, dann mach ich folgendes

Code:

img = randi([intmin('int16'), intmax('int16')], 10, 10, 'int16');  % Test data
mask = int16(bin2dec('1111 1111 1100 0000'));
img2 = bitand(img, mask);
 


und erhalte in img2 nur positive Zahlen...
Ich möchte ja gerade das bestehende int16-Bild z.B. auf den Wertebereich int14 überführt haben. Der Hintergrund ist der, dass der zwangsläufige Informationsverlust dargestellt werden soll.

Zweitens:
Der Type-Cast uint16() bzw. int16() bewirkt doch eigentlich, dass das resultierende Bild img2 wieder im uint16 bzw. int16 Format vorliegt, oder liege ich da falsch?

Vielen Dank vorab und Grüße! Smile
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.06.2018, 10:28     Titel:
  Antworten mit Zitat      
Hallo Magnus_11,

Du hast zunächst von "Bildern" gesprochen. Dann sind Signed Integer sehr ungewöhnlich. Bist Du sicher, dass Du ein Bit für das Vozeichen in Deinen Daten hast?

Zitat:
und erhalte in img2 nur positive Zahlen...

Ja, das ist zu erwarten. Hast Du eine Frage dazu?

Zitat:
int16(bin2dec('1111 1111 1100 0000'))

Die Binäre Zahl hat 16 Stellen. In dezimal ist dies 65472. Da Du es aber als int16 castest, wird es auf den gültigen Wertebereich -32678:32676 begrenzt. Dabei fällt das erste Bit weg, das ja das Vorzeichen ist. Danach hat "mask" also kein Vorzeichen und ein bitand führt zu positiven Zahlen.

Vielleicht wolltest Du einen typecast durchführen:
Code:
]int16(bin2dec('1111 1111 1100 0000'))
typecast(uint16(bin2dec('1111 1111 1100 0000')), 'int16')


Zitat:
Der Type-Cast uint16() bzw. int16() bewirkt doch eigentlich, dass das resultierende Bild img2 wieder im uint16 bzw. int16 Format vorliegt, oder liege ich da falsch?

Das kommt darauf an. Erstens sind Cast und Type-Cast zwei unterschiedliche Dinge (siehe oben). Zweitens ist mir nicht genau klar, welches Casting Du hier meinst.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Magnus_11

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.06.2018, 13:46     Titel:
  Antworten mit Zitat      
Danke für Deine Rückmeldung!
Ja, in der Tat habe ich keine "normalen" Grauwertbilder vorliegen, sondern tatsächlich Matrizen, die vorzeichenbehaftete Werte im int16-Intervall enthalten.
Diese Werte sind nun z.B. auf das int14-Intervall zu reduzieren. Diese Werte sind dann schließlich ganzzahlig und vorzeichenbehaftet, und repräsentieren somit z.B. Pseudo-int14-Bilder bzw. -Daten.

Ich habe mich bisher damit abgeholfen, aus den prozentualen Anteilen der Originalwerte am int16-Intervall auf die entsprechenden Werte im anderen Intervall zu schließen. Funktioniert letztlich auch, obwohl ich mir nicht sicher bin ob das in Matlab nicht doch irgendwie einfacher handhabbar ist.
Oder ob es hierzu nicht schon gängige Herangehensweisen gibt.

Danke und Grüße
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.06.2018, 15:36     Titel:
  Antworten mit Zitat      
Hallo Magnus_11,
Zitat:
Ich habe mich bisher damit abgeholfen, aus den prozentualen Anteilen der Originalwerte am int16-Intervall auf die entsprechenden Werte im anderen Intervall zu schließen.

Das verstehe ich nicht. Musst Du nicht einfach nur die beiden niedrigst-wertigen Bits auf 0 setzen?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Magnus_11

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.06.2018, 07:49     Titel:
  Antworten mit Zitat      
Ich weiß, dass meine Lösung lediglich eine Pseudo-Lösung darstellt ...
Da ich eben nicht durchsteige, wie man die von Dir beschriebenen niedrigsten Bits auf Null setzt habe ich mir auf die Schnelle so abgeholfen.

Wie sähe der Code für meine int16-Daten aus, wenn man die entsprechenden Bits auf Null setzt, um als Resultat zB int14-Daten vorliegen zu haben?

Verzeiht mir meine Unwissenheit ...
Vielen Dank für eure Unterstützung.
 
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.