2015-04-15 12 views
5

Sto assemblando un programma per calcolare alcune cose con le uscite dell'oscilloscopio, ma mentre il programma funziona ora, importare l'immagine in MATLAB e quindi utilizzare ginput per trovare le coordinate di varie regioni in la curva generata.Tracciare una riga in un'immagine MATLAB

C'è un modo che posso prendere, per esempio, questa immagine:

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

e hanno ginput o qualcosa di simile tracciare automaticamente lungo la curva verde brillante e memorizzare x, y coordinate separare array (forse essendo in grado di discriminare tra il colore della curva e il colore di sfondo)? In questo modo posso invece usare un grafico reale delle coordinate x, y della curva nell'immagine, invece di dover effettivamente usare l'immagine nell'analisi dei dati.

Il più vicino che sono stato in grado di ottenere è solo utilizzando [x,y]=ginput per schiacciare il pulsante del mouse lungo la curva e generare un array enorme, ma le mie dita hanno bisogno di riposo!

Grazie!

+0

Una domanda minore, ma molto importante: Fare la 'x, y' coordinate della curva generato necessità di correlare con il sistema di coordinate dell'oscilloscopio ? – rayryeng

+0

Non proprio, solo le coordinate x, y dei pixel in cui si trovano i punti della curva. Sembra che il suggerimento sotto potrebbe essere esattamente quello che sto cercando - ti aggiornerà ragazzi una volta che riuscirò a raggiungere un computer. – bieberman

+0

Sembra buono! Ero solo curioso. – rayryeng

risposta

11

Date un'occhiata a questo

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 

Ora è possibile tracciare i punti:

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

risultante con enter image description here

Se sei turbato dal fatto che la linea è spessa (vale a dire, Più valori y per ogni x) si può semplicemente prendere la media

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

Visualizzazione della linea

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

enter image description here


Se dopo la griglia così, allora

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

Per determinare i punti della griglia cerchiamo x tale che molti punti della griglia gy ha lo stesso 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 

Lo stesso vale per y:

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

rimuovere i duplicati:

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

Creare la griglia punti

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

Ora l'intero quadro:

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! Niente come qualche semplice soglia per fare il lavoro. +1. – rayryeng

+1

OK, ora lo vedo con 'accumarray'. Eccellente. – rayryeng

+0

Sarebbe un processo simile includere anche la griglia? – bieberman

Problemi correlati