2016-12-30 9 views
0

Typ I mit dem folgenden Befehl ein Bild lese:Umwandeln eines Bildes Doppel

lefty = imread('sintra2.JPG'); 

und imshow(); gibt mir ein gutes resault. aber wenn ich versuche zu verwenden:

lefty = double(imread('sintra2.JPG')); 

imshow() gibt mir ein weißes Bild. Ich arbeite mit einem relativ großen Bild shared here. Gibt es eine Verbindung?

Wie kann ich konvertieren, wenn es überhaupt notwendig ist? Mir wurde gesagt, dass es besser ist mit Double zu arbeiten, wenn man in MATLAB an Bildverarbeitung und Computer Vision arbeitet.

Antwort

6

Wenn Sie das Bild zu lesen, war seine Art uint8 und somit lefty enthalten die Werte von 0 bis 255 (2 = 256). Wenn Sie double verwendeten, konvertierte es die Klasse von uint8 zu double aber die Werte blieben gleich, d. H. 0-255.

Sie benötigen hier im2double, die nicht nur die Werte in doppelte Genauigkeit konvertiert, sondern auch die Werte im Bereich 0-1 neu skaliert, indem alle Einträge der Eingabe durch den maximal möglichen Wert des Eingabedatentyps dividiert werden. In Ihrem Fall ist der Eingabedatentyp uint8, dessen maximal möglicher Wert 255 ist. Daher werden alle Werte durch 255 geteilt. Beachten Sie, dass der Maximalwert in Ihren Bilddaten möglicherweise nicht 255, sondern der Maximalwert ist möglicher Wert von uint8 255, so dass alle Werte von 255

so sind die aufgeteilt werden finden, was Sie suchen:

lefty = imread('sintra2.JPG'); 
imshow(lefty) 
figure 
imshow(im2double(lefty)) 
+1

Ich würde dies umformulieren: * "aber skaliert auch die Werte zwischen 0 und 1" *. Die Leute haben den falschen Eindruck, dass, wenn Ihre Bilddaten nicht den gesamten Dynamikbereich des Datentyps umfassen (zum Beispiel ein Minimum und Maximum von 32 und 128 für 'uint8'), "im2double" dieses Bild skaliert, so dass das Minimum ist 0 und das Maximum ist 1. Alles "im2double" ist, dass es erkennt, um welchen Typ das Bild geht und teilt alle Einträge in der Eingabe mit dem größtmöglichen Wert des Eingabetyps. Außer der Division wird keine zusätzliche Skalierung durchgeführt. Das bin nur ich und ich mag es zu picken. – rayryeng

+1

@rayryeng Es schien mir vorher offensichtlich, aber jetzt nachdem ich Ihren Kommentar und die andere Antwort gelesen habe, stimme ich mit dem überein, was Sie gesagt haben. So editiert es nach deiner Empfehlung. Danke –

+1

Ehrfürchtig. Habe eine Verbesserung von mir. – rayryeng

3

Das Problem ist mit dem Datentyp, den imshow erfordert. Wenn das Bild vom Typ int ist, sollte sein Bereich zwischen 0 und 255 liegen. Wenn es doppelt ist - zwischen 0,0 und 1,0. Versuchen Sie folgendes:

lefty = imread('sintra2.JPG'); 
imshow(lefty) 

oder:

lefty = imread('sintra2.JPG'); 
imshow(double(lefty)/double(max(lefty(:)))) 
+0

also im Grunde das Bild ist in Ordnung und umgewandelt zu verdoppeln und die Einziges Problem ist die 'imshow()' Darstellung? – havakok

+1

Ja, Sie haben Recht – desa

+0

@havakok Um solche Probleme in Zukunft zu vermeiden, lassen Sie 'imshow' das Bild für Sie skalieren:' imshow (lefty, []); 'Das zweite Argument gibt an, wie die minimale und maximale Intensitätskarte zu und ist Indem Sie '[]' tun, skaliert es Ihre Bilddaten so, dass die kleinste Intensität 0 ist und die größte Intensität 1 für ein Bild vom "doppelten" Typ ist. – rayryeng