2016-04-07 4 views
0

Ich versuche, dieses Bild zu digitalisieren mit MATLAB:Plot Digitalisierung in MATLAB mit G Eingang

log scale plot

Ich habe das folgende Skript:

%// Get data from plot 
clear all; close all; 
%// Input 
fname = 'Fig15a.PNG'; 
xvec = [1e3:1:1e8]; 
yvec = [1e-4:1:1e-1]; 
    xt = [1e3 1e4 1e5 1e6 1e7 1e8]; 
    yt = [1e-4 1e-3 1e-2 1e-1]; 

%// Read and plot the image 
im = imread(fname); 
figure(1), clf 
im = im(end:-1:1,:,:); 
image(xvec,yvec,im) 
axis xy; 
grid on; 

%// Set ticks 
set(gca,'xtick',xt,'ytick',yt); %// Match tick marks 

%// Collect data 
[x,y] = ginput; %// Click on points, and then hit ENTER to finish 

%// Plot collected data 
hold on; plot(x,y,'r-o'); hold off; 

%// Then save data as: 
save Fig15a.mat x y 

Das Skript funktioniert Line scale output

Gibt es einen Weg, ich kann die x und y Achsen zu a logarithmische Darstellung ? Ich habe versucht, an verschiedenen Orten ohne Glück den folgenden Code hinzu:

%// Set Log scale on x and y axes 
set(gca,'XScale','log','YScale','log'); 
+0

Warum verwenden Sie keine vorhandenen Tools dafür? Z.B. [this] (http://plotdigitizer.sourceforge.net/) –

+0

Danke, kannte keine vorhandenen Tools. Folgte meinem Vorgesetzten blind in MatLab :) würde Teig noch aus Neugier wissen, ob das in MatLab möglich war –

Antwort

0

ist Below ein Proof of Concept, das Sie auf dem richtigen Weg bekommen sollte. Ich habe die Dinge in Ihrem ursprünglichen Code durch "gute Praktiken" ersetzt.

function q36470836 
%% // Definitions: 
FIG_NUM = 36470836; 
%% // Inputs: 
fname = 'http://i.stack.imgur.com/2as4t.png'; 
xt = logspace(3,8,6); 
yt = logspace(-4,-1,4); 
%% // Init 
figure(FIG_NUM); clf 
% Read and plot the image 
im = imread(fname); 
hIMG = imshow(im); axis image; 

%// Set ticks 
hDigitizer = axes('Color','none',... 
        'XLim',[xt(1) xt(end)],'YLim',[yt(1) yt(end)],... 
        'XScale','log','YScale','log',... 
        'Position',hIMG.Parent.Position .* [1 1 696/785 (609-64+1)/609]); 

uistack(hDigitizer,'top'); %// May be required in some cases 
grid on; hold on; grid minor; 

%// Collect data: 
[x,y] = ginput; %// Click on points, and then hit ENTER to finish 

%// Plot collected data: 
scatter(x,y,'o','MarkerEdgeColor','r'); 

%// Save data: 
save Fig15a.mat x y 

Hier ist ein Beispiel dafür, wie es aussieht:

Output

Ein paar Hinweise:

  • xt, yt kann in eine sauberere Art und Weise erstellt werden logspace.
  • Es ist schwierig (möglicherweise unmöglich), das Digitalisierungsraster korrekt mit dem Bild auszurichten, was unweigerlich zu Fehlern in Ihren Daten führen würde. Obwohl dies in den folgenden Szenarien geholfen wird (für die Sie einen Vektor-Grafik-Editor, wie zB die Freeware InkScape benötigen):
    1. Wenn durch Zufall, hast du dieses Bild aus einer PDF-Datei, wo es erscheint als Vektorbild (Sie können dies durch Zoomen so viel wie Sie wollen, ohne die Grafik pixelig; diese scheint zu sein Fall von der Art, wie die .png aussieht), wäre es besser aus speichern Sie es als ein Vektorbild und dann haben Sie zwei Optionen:
    2. Exportieren des Bildes in ein Bitmap mit einem stark erhöhte Auflösung und dann den Digitalisierungsvorgang erneut versuchen.
    3. Speichern Sie das Vektorbild als .svg dann öffnen Sie die Datei mit Ihrem Lieblings-Texteditor und erhalten die genauen Koordinaten der Punkte.
    4. Wenn das Quellbild eine Bitmap ist (im Gegensatz zur Vektorgrafik), können Sie "trace the bitmap", also konvertiert es in Vectoric, dann #GOTO Schritt 1.
  • Diese Lösung unterstützt (derzeit) nicht die Größenänderung der Figur.
  • Die magischen Zahlen, die in der Position Einstellung erscheinen, sind Skalierungsfaktoren, die in der folgenden Abbildung erklärt werden (und auch size(im) ist [609 785 3]). Diese können technisch mit "primitiver Bildverarbeitung" gefunden werden, aber in diesem Fall habe ich sie nur explizit codiert. Explanation of magic numbers
0

Sie in doppelt logarithmischer Skala mit

loglog(x,y); 

help loglog oder der Dokumentation gibt zusätzliche Informationen plotten können.

Für eine logarithmische Skala Verwendung

semilogx(x,y); 
semilogy(x,y); 
+0

Mein Problem ist nicht auf einer Loc-Skala zu plotten, sondern eine Loc-Skala beim Importieren meines Image 'image (xvec, yvec, im) ' –