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

Erkennung von Körnern in einer Schale

 

Becks_jn
Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 02.09.11
Wohnort: ---
Version: R2018
     Beitrag Verfasst am: 29.08.2015, 13:55     Titel: Erkennung von Körnern in einer Schale
  Antworten mit Zitat      
Hallo liebe Matlab-User,

ich habe ein Problem bei der Detektion von Körnern in einer Schale (siehe Bild).

Ich muss die Anzahl der Körner in dem Bild detektieren. Ich habe es schon mit folgendem Beispiel probiert.

http://de.mathworks.com/help/images.....ncement-and-analysis.html

Leider berühren sich meine Körner bei der Umwandlung in ein bw-Bild, weshalb der Algorithmus nicht greift.

Auch folgendes Beispiel hat nicht funktioniert, weil die Körner zu eng aneinander liegen.
http://blogs.mathworks.com/steve/2006/06/02/cell-segmentation/

Frage:
Geht es überhaupt jedes Korn zu detektieren, wie ist eure Meinung?
Weiß jemand welches Verfahren dazu am besten geeignet ist?
Hat jemand einen entsprechenden Beispielcode?

Vielen Dank für Eure Hilfe.

Detektionstest2.jpg
 Beschreibung:

Download
 Dateiname:  Detektionstest2.jpg
 Dateigröße:  259.77 KB
 Heruntergeladen:  517 mal
Private Nachricht senden Benutzer-Profile anzeigen


marvin.be
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 28.08.15
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 29.08.2015, 14:47     Titel:
  Antworten mit Zitat      
Hi Becks_jn,

ich habe mal so was ähnliches programmiert, allerdings mit Nanopartikeln (bzw. Nano-Clustern) in Zellen. Allerdings hat mir damals das bereits von dir genannte Beispiel sehr geholfen. Über Nacht ging aber auch das nicht Wink

Ich behaupte das Problem liegt weniger am MatLab Code als an deinem Bild selber. Zum einen könnte die Auflösung einfach zu gering sein (k.A. ob das von dir gezeigte Bild das Original ist oder ob es verkleinert wurde). Zum anderen sehen die Körner auf dem Bild ja nahezu alle gleich groß / gleich hell aus... Manche hingegen sind unscharf.

Kannst du an den Parametern deines Experiments was drehen? Z.B. kannst du eine Monolage Körner machen? Kannst du die Auflösung verbessern? Die Belichtungsrichtung ändern? Bei letzterem denke ich an dieses Programm das in den letzten Tagen durch die Presse ging. Das besagte Programm kann an Hand von Helligkeitsunterschieden aus Google Earth Bildern sagen wie effektiv eine Solaranlage auf deinem (oder deines Nachbarn) Dach sein wird. Einfach nur durch die Helligkeitsunterschiede / Lichtreflexionen vom Dach.

Gruß Marvin
Private Nachricht senden Benutzer-Profile anzeigen
 
Becks_jn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 02.09.11
Wohnort: ---
Version: R2018
     Beitrag Verfasst am: 31.08.2015, 07:52     Titel:
  Antworten mit Zitat      
Hallo Marvin,

vielen Dank für deine Antwort. Ich werde Versuchen die Qualität des Bildes zu verbessern, weiß aber nicht genau ob mir das gelingt.

Ich gehe jetzt nach folgendem Verfahren zur Detektion vor:
1. Bild aufarbeiten
2. Watershed zur detektion der Partikel
3. Detektion der Ellipsen mit regionprops

Leider habe ich eine sehr unsaubere Detektion (siehe Bilder im Anhang)
Wenn ich mir mit imperim die Durchmesser in meinem bw Bild berechnen lasse, dann sieht das ganze nicht schlecht aus (VorWatershed). Wenn ich das Bild aufarbeite und den watershed-Algorithmus laufen lasse und dann manuell Ellipsen für jede gefundene Region in das Bild rechnen lasse ist das Ergebniss ungenügend (Nach Watershed).

Mein Code:
Code:

I = imread('Detektionstest2.jpg');
I_cropped = imcrop(I,[150 150 300 300]);% Croppregion anpassen
imshow(I_cropped);
I_cropped = rgb2gray(I_cropped);
%% Elimenate background noise
background = imopen(I_cropped,strel('disk',15));
I2= I_cropped - background;                      
imshow(I2);
%% Kontrast erhöhen
I_eq = adapthisteq(I_cropped);
imshow(I_eq)
%% Elimenate background noise
background = imopen(I_eq,strel('disk',15));
Ieq= I_eq - background;                      
imshow(I_eq);
%% Umwandlung in ein Binärbild
bw = im2bw(I_eq, graythresh(I_eq));
imshow(bw)
%% Overlay to see the grain which can be detect
bw_perim = bwperim(bw);
overlay1 = imoverlay(I_eq, bw_perim, [.3 1 .3]);
imshow(overlay1)
%% Postprocessing the watersed algorithm
I_eq_c = imcomplement(I_eq);
I_mod = imimposemin(I_eq_c, ~bw);
%%
L = watershed(I_mod);
rgb = label2rgb(L,'lines',[.5 .5 .5]);
figure, imshow(rgb,'InitialMagnification','fit')
%% regionprops
graindata = regionprops(L, 'all');
%% Fit Ellipse in Picture
imshow(I_cropped)
hold on;
phi = linspace(0,2*pi,50);
cosphi = cos(phi);
sinphi = sin(phi);
for k = 1:length(graindata)
    xbar = graindata(k).Centroid(1);
    ybar = graindata(k).Centroid(2);
    a = graindata(k).MajorAxisLength/2;
    b = graindata(k).MinorAxisLength/2;
    theta = pi*graindata(k).Orientation/180;
    R = [ cos(theta)   sin(theta)
         -sin(theta)   cos(theta)];
    xy = [a*cosphi; b*sinphi];
    xy = R*xy;
    x = xy(1,:) + xbar;
    y = xy(2,:) + ybar;
    plot(x,y,'r','LineWidth',2);
end


Hat jemand einen Tipp, wie ich meinen Code optimieren kann?

VorWatershed.JPG
 Beschreibung:

Download
 Dateiname:  VorWatershed.JPG
 Dateigröße:  63.79 KB
 Heruntergeladen:  541 mal
NachWatershed.JPG
 Beschreibung:

Download
 Dateiname:  NachWatershed.JPG
 Dateigröße:  55.04 KB
 Heruntergeladen:  533 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Tasso

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2015, 10:24     Titel:
  Antworten mit Zitat      
Hallo Becks_in,

das Problem ist, wie marvin schon vermutet hat, dein Bild. Die Abgrenzungen zueinander sind verwaschen. Du brauchst eine Funktion, die die Kontraste erhöht. Also die Körner schärfer voneinander trennt.

Leider gibt es da nicht viele. Eine einfache Methode wäre ein Filterkern ([-1 -1 -1;-1 8-1;-1 -1 -1]). du kannst die Werte erhöhen oder auch 5*5 Kernel nehmen. Eine andere Möglichkeit, die Körner voneinander zu trennen wäre die BlindDeconvlution. Das Bild also als unscharf bewerten. Sie dazu deconvblind und ähnliche.

Gruß Tasso
 
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 - 2024 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.