2015-04-15 11 views
5

Ich stelle ein Programm zusammen, um etwas mit Oszilloskopausgängen zu berechnen, aber da das Programm jetzt läuft, importiere ich das Bild einfach in MATLAB und benutze dann ginput um die Koordinaten verschiedener Regionen zu finden die generierte Kurve.Eine Linie in einem Bild verfolgen MATLAB

Gibt es eine Möglichkeit, die ich nehmen kann, sagen wir, um dieses Bild:

sine wave] (http://imgur.com/IlSDDLK) ![sine wave

und haben G Eingangs oder etwas ähnliches automatisch entlang der leuchtend grüne Kurve verfolgen und die x zu speichern, y-Koordinaten-Arrays zu trennen (vielleicht, weil man zwischen der Farbe der Kurve und der Hintergrundfarbe unterscheiden kann)? Auf diese Weise kann ich stattdessen eine tatsächliche Darstellung der x, y-Koordinaten der Kurve im Bild verwenden, anstatt das Bild tatsächlich in der Datenanalyse verwenden zu müssen.

Die nächste, die ich bekommen konnte, ist nur [x,y]=ginput verwenden, um die Maustaste entlang der Kurve zu zerquetschen und eine massive Anordnung zu generieren, aber meine Finger brauchen Ruhe!

Danke!

+0

Eine kleine Frage, aber sehr wichtig: Ist die 'x, y' Koordinaten der erzeugten Kurve müssen mit dem Koordinatensystem des Oszilloskops korrelieren ? – rayryeng

+0

Nicht wirklich, nur die x, y Koordinaten der Pixel wo die Punkte der Kurve liegen. Es sieht so aus, als ob der folgende Vorschlag genau das ist, wonach ich suche - werde euch updaten, sobald es mir gelingt, an einen Computer zu kommen. – bieberman

+0

Klingt gut! War nur neugierig. – rayryeng

Antwort

11

Werfen Sie einen Blick auf diese

img = imread('http://i.stack.imgur.com/3GH1x.jpg'); %// read the image 
bw = img(:,:,2) > 128; %// pick only green points (2nd RGB channel) 
bw(275:end,:) = false; %// discard the lower flat line 
[yy xx]=find(bw); %// get the x-y coordinates of green pixels 

Jetzt können Sie die Punkte zeichnen:

figure;plot(xx,yy, '.'); 

mit Resultierende enter image description here

Wenn Sie durch die Tatsache beunruhigt sind, dass die Linie dick ist (dh, Mehrere y-Werte für jedes x) können Sie einfach den Mittelwert nehmen

uy = accumarray(xx, yy, [], @mean); 
ux = 1:max(xx); 

Visualizing der Linie

figure;imshow(img);hold on; plot(ux,uy,'r','LineWidth',1.5); 

enter image description here


Wenn Sie auch nach dem Netz sind, dann

[gy gx] = find(max(img,[],3) < 60); %// get the darkest points 

der Gitterpunkte bestimmen wir x, so dass viele Gitterpunkte gy das gleiche hat gx

nx = hist(gx,1:size(img,2)); %// count how many gx per x location 
gxx = find(nx > 100); %// only those with more than 100 are grid X 

Das Gleiche gilt für y suchen:

ny = hist(gy,1:334); 
gyy = find(ny > 100); 

Duplikate entfernen:

gxx(diff([0 gxx]) == 1) = []; 
gyy(diff([0 gyy]) == 1) = []; 

Erstellen Sie das Gitter Punkte

[GX GY] = meshgrid(gxx, gyy); 

nun das ganze Bild:

figure('Name','I MUST award Shai a FAT Bounty for this'); 
imshow(img);hold on; 
plot(ux,uy,'r','LineWidth',1.5); %// the curve 
scatter(GX(:), GY(:), 150, '+c'); %// the grid 

enter image description here

+0

Heh! Nichts wie eine einfache Schwelle, um den Job zu erledigen. +1. – rayryeng

+1

OK, jetzt sehe ich es mit 'accumarray'. Ausgezeichnet. – rayryeng

+0

Wäre es ein ähnlicher Prozess, um auch das Raster mit einzubeziehen? – bieberman

Verwandte Themen