WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Abstand Objekt zu Oberfläche in Pixel bestimmen!

 

Highspeed

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2012, 17:14     Titel: Abstand Objekt zu Oberfläche in Pixel bestimmen!
  Antworten mit Zitat      
Hallo

Ich bin bei Matlab blutiger Anfänger. Vielleicht könnt ihr mir trotzdem helfen.

Ich habe 2 Bilder eingeladen per Schleife (for, end) diese Bilder auch in 2 binäre Bilder (im2bw) umgewandelt und per Kantenerkennung (edge 'sobel') verändert, dass ich nurnoch 2 Linien zu erkennen sind.

Soweit alles okay. Jetzt will ich den Abstand zwischen dem Kreis und der Oberfläche in Pixeln bestimmen. Wie kann ich das realisieren und vernünftig ausgeben?

Ich hab die beiden Bilder angehängt.

Hoffe meine Fragestellung war klar genug. Danke schonmal im Vorraus!!

Thorsten

01_0Spalt5_75f_10kHz0000000045.tif
 Beschreibung:

Download
 Dateiname:  01_0Spalt5_75f_10kHz0000000045.tif
 Dateigröße:  58.85 KB
 Heruntergeladen:  731 mal
01_0Spalt5_75f_10kHz0000000044.tif
 Beschreibung:

Download
 Dateiname:  01_0Spalt5_75f_10kHz0000000044.tif
 Dateigröße:  58.65 KB
 Heruntergeladen:  688 mal


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.11.2012, 18:11     Titel: Re: Abstand Objekt zu Oberfläche in Pixel bestimmen!
  Antworten mit Zitat      
Hallo Highspeed,

Geht es um zwei Bilder, oder soll dies automatisch mit 4000 Bildern geschehen?

Bei zwei Bildern würde ich das mit der Lupe im Photoshop machen und per Hand abzählen.
Bei vielen Bildern wäre es ein Ansatz, eine Gerade und einen Kreis an die Daten zu fitten und deren Abstand analytisch berechnen. Bei der großen Anzahl an Punkten pro Objekt bekommst Du ein Ergebnis mit Sub-Pixel-Genauigkeit.

Bitte erkläre die Aufgabe also noch genauer.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Highspeed

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.11.2012, 09:55     Titel:
  Antworten mit Zitat      
Hallo Jan S und natürlich alle anderen!

Klar bei zwei Bildern würde es deutlich schneller gehen wenn man die Pixel per Hand zählt.
Es sind so ca. 2000 Bilder. Eine Sequenz aus Hochgeschwindigkeitsaufnahmen von einem "Festklopfprozess". Das ist eine mechanische Oberflächenbehandlung bei der ein Roboterarm die Oberfläche abrastert und durch plastische Verformung diese sowohl glättet als auch härtet. Bisschen vergleichbar mit Kugelstrahlen.

Ich möchte eine automatische Auswertung der Bilder. Als Ergebnis die Verschiebung bzw. den Geschwindigkeitsverlauf bestimmen.

Code:
% Das ist mein Programm bisher
verz_in = 'C:\Users\Thorsten\Documents\MATLAB\Bilder';
name_in = '01_0Spalt5_75f_10kHz0000';
von = 44;
bis = 45;

% Schleife über alle auszuwertenden Bilder
for ii = von:bis
% for ii = von:bis % zur Wartung können gezielte Bilder ausgewählt werden
   
    % Auszuwertendes Bild einlesen und beschneiden
    bild = imread([verz_in,'\',name_in,num2str(ii,'%02.0f'),'.tif']);
    Hintergrund = imread('C:\Users\Thorsten\Documents\MATLAB\Hintergrund.tif');
   
    [m,n] = size(bild);
    bild2 = bild(1:m, 80:n-350);
    bild3 = im2bw(bild2, 100/255);
    dim = size (bild3);
    bild4=edge(bild3,'sobel');
   
    imshow(bild4),axis on;%(bild2,[100 170],axis on)
    saveas(gcf,[verz_in,'\',name_in,num2str(ii,'%06.0f'),'.tif']);
     
end
 


Ich komm einfach nicht weiter bei der Abstandsbestimmung zwischen der Oberfläche und dem Halbkreis. Wäre super wenn mir da jmd weiterhelfen könnte.

Gruß Thorsten
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 22.11.2012, 10:28     Titel:
  Antworten mit Zitat      
Moin,

wenn du dir die Bildzeile in halber Höhe ausgeben lässt, bekommst du die fortlaufenden Dichtewerte, die mit 0 beginnen. Dann folgen vielleicht 2 Pixelwerte mit 1 und dann werden die von dir gesuchten Pixelwerte in 0 ausgeben. Es müsste doch möglich sein, dass irgendwie in eine Formel zu schreiben. Da es sich nicht um Grautöne handelt, sondern nur um 0 + 1 wären die Ergebnisse eindeutig.

Viele Grüße

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 22.11.2012, 10:56     Titel:
  Antworten mit Zitat      
Hallo,

zwei Möglichkeiten:

1. Verwende eine andere Funktion

Code:

    % Alle Objekte beseitigen, welche weniger als ein Pixel enthalten
    bw = bwareaopen(image,1);

    % Erstellen und Schließen einer morphologischen Struktur
    se = strel('disk',1);
    bw = imclose(bw,se);

    % Kanten der Sturktur ermitteln
    [B,L] = bwboundaries(bw,'holes');
 


In B sind dann Kreissegment und Gerade enthalten. Über eine simple Min-Betrachtung in x-Richtung des Kreissegmentes erhält man den Abstand.

2. Moore-Nachbarschaft verwenden

Verwende die Moore-Nachbarschaft, um das Kreissegement zu erkennen. Über eine simple Min-Betrachtung in x-Richtung des Kreissegmentes erhält man den Abstand.

3. Vielleicht eine noch einfachere Variante

Starte mittig rechts im Bild. Gehe soweit nach links, bis du auf ein weißes Pixel triffst. Überprüfe den oberen Bereich der Moore-Nachbarschaft des Pixels. Wenn du darin ein Pixel findest, dass nach rechts versetzt ist, gehe nach unten, umgekehrt analog. Mache das solange, bis ein Richtungswechsel stattfindet. Speichere währenddessen immer das aktuelle Minimum.

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 22.11.2012, 11:19     Titel:
  Antworten mit Zitat      
Und noch einfacher:

Beginne oben links und gehe jede Zeile durch. Gehe in der aktuellen Zeile jede Spalte durch. Wenn du auf ein weißes Pixel triffst, beginne zu zählen. Triffst du erneut auf ein weißes Pixel, stoppe das Zählen. Wenn in einer Zeile nicht gleichsam begonnen und gestoppt werden kann, ist diese Zeile ungültig. Der minimale Zählwert ist der Abstand.
Private Nachricht senden Benutzer-Profile anzeigen
 
Highspeed

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.11.2012, 15:37     Titel:
  Antworten mit Zitat      
MaFam hat Folgendes geschrieben:
Und noch einfacher:

Beginne oben links und gehe jede Zeile durch. Gehe in der aktuellen Zeile jede Spalte durch. Wenn du auf ein weißes Pixel triffst, beginne zu zählen. Triffst du erneut auf ein weißes Pixel, stoppe das Zählen. Wenn in einer Zeile nicht gleichsam begonnen und gestoppt werden kann, ist diese Zeile ungültig. Der minimale Zählwert ist der Abstand.


Das klingt sehr interessant. Aber ich brauch Hilfe beim Anfangen.

Mein "bild4" entspricht einer 248x83 Matrix im Format "logical", besteht also nur aus 0 und 1.

Wie lade ich die Matrix und wie beginne ich dann von links oben an zu zählen und höre bei der zweiten 1 auf?
Hab den ganzen morgen danach gesucht aber nichts brauchbares gefunden.

Vielen Dank an alle!
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 22.11.2012, 16:31     Titel:
  Antworten mit Zitat      
Der Anfang ginge, denke ich, so:

Code:

[k,m]=size(bild4);
bestdis=m;

for i=1:k
   start_p=false;
   end_p=false;
   first=false;
   for j=1:m
      if(bild4(i,j)==0)
          if(~first)
             start_p=true;
             first=true;
             pixelstart=j;
          else
             end_p=true;
             pixelend=j;
          end
      else if(bild4(i,j)==1 && first)
          pixelstart=j;
      end
   end
   first=false;
   if(start_p && end_p)
       curdis=pixelend-pixelend;
       bestdis=min(bestdis,curdis);
   end
   start_p=false;
   end_p=false;
end
 


Am besten jedoch mit find arbeiten...

Code:

[k,m]=size(bild4);
bestdis=m;
v0=find(bild4'==0);

for i=1:k
   curind=v0((v0<=(i-1)*k+m) == (v0>(i-2)*k+m));
   
   if(numel(curind)>=2)
      bestdis=min(bestdis, max(diff(curind)));
   end
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 22.11.2012, 19:26     Titel:
  Antworten mit Zitat      
Ich hatte den Code zwischenzeitlich verändert, da die ursprüngliche Version darauf ausgerichtet war, dass die Kanten höchsten eine Dicke von einem Pixel haben. Das trifft bei deinem Beispiel offensichtlich nicht zu. Ich würde allerdings eh zur zweiten Variante meines Codes raten...
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 23.11.2012, 11:19     Titel:
  Antworten mit Zitat      
Hier eine wirklich funktionierende Variante:

Code:

clc
image = imread('01_0Spalt5_75f_10kHz0000000045.tif');

[k,m]=size(image);
dis=m;
v0=find(image'==1);

for i=1:k
   curind=v0((v0<=i*m) == (v0>(i-1)*m));
   if(numel(curind)>=2)
     if(max(diff(curind))>1)
      dis=min(dis,max(diff(curind)));
     end
   end
end

dis
 


Es kommt 14 raus. Auch die Variante ist nicht wirklich schön, weil direkt aufeinander folgende Pixel mit max(diff(curind))>1 gefiltert werden. Das bedeutet, dass ein Abstand der kleiner ist als eine Gruppe von direkt aufeinander folgenden Pixeln nicht erfasst werden kann. Daher müsste man diese Gruppen zuvor identifizieren und rausfiltern.
Private Nachricht senden Benutzer-Profile anzeigen
 
Highspeed

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2012, 12:21     Titel:
  Antworten mit Zitat      
Schonmal vielen Dank für die viele Mühe. Habe noch ein paar Fragen zu deinem Code, weil wenn ich schon nicht die Arbeit habe, will ich es doch verstehen Smile

Code:

[k,m]=size(bild4); %Größe vom Bild wird ausgelesen und in die Variablen k und m aufgeteilt
bestdis=m; %bestdis ist dann nachher mein Ergebnis?
v0=find(bild4'==0); %was genau macht dieser Befehl? Suche im bild4 nach 0? Wieso macht man==?

for i=1:k
   curind=v0((v0<=(i-1)*k+m) == (v0>(i-2)*k+m));
   
   if(numel(curind)>=2)%hier berücksichtigst du den Fall, dass ich mehr als 2 Pixel in einer Zeile habe?
      bestdis=min(bestdis, max(diff(curind)));
   end
end
 
[/quote]


Mein Problem ist, dass ich kein Ergebnis dabei rausbekomme. bestdis hat bei mir immer einen Wert von 2.

Hoffe ihr seid nicht schon zusehr genervt. Vielen Dank schonmal für alles!
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 23.11.2012, 12:26     Titel:
  Antworten mit Zitat      
Bitte meine letzte Variante verwenden. Ich hatte noch einige Fehler in den anderen Varianten und konnte erst heute selbst mal testen.

Ich kann die Zeilen gerne noch kommentieren später...
Private Nachricht senden Benutzer-Profile anzeigen
 
Highspeed

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2012, 12:34     Titel:
  Antworten mit Zitat      
[quote="MaFam"]Hier eine wirklich funktionierende Variante:

[code]

Oh da war ich zu langsam Smile Wird gleich getestet!! Danke
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.