2016-07-23 9 views
-1

Für die gleiche Matrix ist das Bild, das von der Funktion imshow() von Matplotlib und Matlab erzeugt wird, unterschiedlich. wie einige Parameter von imshow() in matplotlib ändern kann gleiches Ergebnis in MatlabWie erzeuge ich das gleiche Bild mit der Funktion von imshow() aus Matplotlib (Python) und Imshow() in Matlab?

%matlab 
img = 255*rand(101); 
img(:,1:50)=3; 
img(:,52:101)=1; 
img(:,51)=2; 
trans_img=imtranslate(img,[3*cos(pi/3),3*sin(pi/3)]); 
imshow(trans_img) 

This is an image generated by matlab

#python 
import numpy as np 
import matplotlib.pyplot as plt 
from mlab.releases import latest_release as mtl #call matlab function 

img = 255 * np.random.uniform(0, 1, (101, 101)) 
img[:, 51:101] = 1 
img[:, 0:50] = 3 
img[:, 50] = 2 
trans_img = mtl.imtranslate(img, [[3*math.cos(math.pi/3),3*math.sin(math.pi/3)]] 
i = plt.imshow(trans_img, cmap=plt.cm.gray) 
plt.show(i) 

This is an image generated by matplotlib

Die trans_img Matrix ist in beiden Fällen gleich, aber die Bilder bekommen in Matlab und Python sind anders

+1

Sie müssen viel genauer festlegen, welches Bild Sie erstellen und was genau zwischen den beiden Versionen ist. – BrenBarn

+0

Entschuldigung, ich habe einige Details meines Codes aktualisiert, um diese Frage spezifischer zu machen. –

Antwort

0

Leider habe ich keine aktuelle genug Version von Matlab, die diehatFunktion, aber zum Glück das image Paket in Octave, was ich bin sicher, ist gleichwertig. Gleichermaßen werde ich das oct2py Modul anstelle von mlab als Ergebnis verwenden, damit Python auf die imtranslate Funktion von Octave innerhalb von Python zugreifen kann.

Octave Code:

img = 255*rand(101); 
img(:,1:50)=3; 
img(:,52:101)=1; 
img(:,51)=2; 
trans_img = imtranslate(img, 3*cos(pi/3),3*sin(pi/3)); 
imshow(trans_img, [min(trans_img(:)), max(trans_img(:))]) 

Python-Code:

import numpy as np 
import matplotlib.pyplot as plt 
import math 
from oct2py import octave 
octave.pkg('load','image'); # load image pkg for access to 'imtranslate' 
img = 255 * np.random.uniform(0, 1, (101, 101)) 
img[:, 51:101] = 1 
img[:, 0:50] = 3 
img[:, 50] = 2 
trans_img = octave.imtranslate(img, 3*math.cos(math.pi/3), 3*math.sin(math.pi/3)) 
i = plt.imshow(trans_img, cmap=plt.cm.gray) 
plt.show(i) 

Bild Resultierende (identischen) in beiden Fällen:

enter image description here

Mein einziger Kommentar, warum Sie haben habe die Diskrepanz gesehen, ist das ich did geben Sie die Werte min und max in imshow an, um eine angemessene Intensitätsskalierung sicherzustellen. Genauso hätten Sie stattdessen imagesc(trans_img) verwenden können (eigentlich bevorzuge ich das). Ich habe solche Grenzen in Python für plt.imshow nicht explizit angegeben ... vielleicht führt sie die Skalierung standardmäßig durch.

Auch Ihr Code hat einen kleinen Fehler; in der Oktavversion von imtranslate zumindest nimmt die Funktion 3 Argumente, nicht zwei. (Außerdem hat Ihr Originalcode eine unsymmetrische Klammer).

+1

Vielen Dank für Ihre Antwort. Ich habe einige Codes dieser Frage aktualisiert. Das einzige, was mich verwirrt, ist die Imshow() von Matlab und Python geben unterschiedliche Bildresultate für die gleiche Matrix. –

+0

Aktualisierte Antwort gemäß aktualisierter Frage. :) Verzeihen Sie auch, dass ich unhöflich bin, aber die Tatsache, dass ich zuerst mit einer zu simples "Köder" antworten musste, um die "echte" Frage zu lösen, ist für alle Beteiligten eine Zeitverschwendung. Bitte geben Sie Ihr Bestes, um beim nächsten Mal passende, spezifische Fragen wie Ihre aktualisierte Version von Anfang an zu stellen :) –

+0

Vielen Dank für Ihre Antwort. Ich habe immer noch ein Problem, weil ich nur einige Parameter von imshow() in Matplotlib ändern möchte, um das gleiche Ergebnis in Matlab mit Imshow (trans_img) zu erreichen. Es ist nicht nötig, einen Parameter wie den Code zu ändern: imshow (trans_img, [ min (trans_img (:)), max (trans_img (:))]). Tut mir wirklich leid, dass ich mein Telefon benutze, um einen Kommentar zu schreiben, nicht um den Code im passenden Format zu setzen. –

Verwandte Themen