Verfasst am: 20.07.2011, 13:43
Titel: Programm zur Bestimmung der Korngößenverteilung
hallo zusammen
hab ein programm mit dem man die Korngrößenverteilung auf bildern bestimmen kann.
problem : wie stelle ich die maße ein, denn es wird nicht angezeigt wie groß die partikel sind, man sieht nur eine häufigkeitsverteilung.
zusätzlich würde ich gern wissen wie man die verteilung von mehreren bildern zusammen bestimmen kann.
im anhang findet ihr das programm.
hab es im guide aufgemacht und soweit ich es verstanden habe, ist nichts geschrieben was die maßen angeht.
Code:
% --- Executes on button press in pushbutton5. function pushbutton5_Callback(hObject, eventdata, handles) % hObject handle to pushbutton5 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
L = getimage(handles.axes2);
stats = regionprops(L);
A = [stats.Area];
figure hist(A) xlabelArea ylabel Popularity
title('Size Distribution')
wie wäre es, wenn Du um ein Partikel einen Ausschnitt legst. Als Rückhabe wird Dir die Anzahl der Pixel wiedergegeben. Diese müssen dann zu einer Größe in Verhätnis gesetzt werden, was aber kein Problem sein dürfte, denn die Größe der eingelesenen Bilder ist bekannt.
nochmal danke für die mühe guru
jetzt ist es mir klar.
damit kann ich aber nur rechteckige ausschnitte machen, die teilchen sind alles andere als rechteckig, außerdem sind es viele teilchen.
kann man den code, den ich angehängt habe, wirklich nicht so ändern, dass auf der x-achse auch die größe angezeigt wird(anhand des bildmaßstabs) und auf der y -achse die anzahl. das ist doch eigentlich der sinn der sache.
Du kannst natürlich einen in Abschnitten anders farbigen Referenzbalken waagerecht in das Bild einfügen, und den Abschnitten eine Maßzahl zuordnen.
Wäre das noch eine Option?
es geht mir um die verteilung der korngößen auf dem bild ( Bsp. ein bild mit reiskörnern)
das programm das ich angehängt habe macht es schon richtig, man kriegt auf der x-achse die größe der körner ( mittlere durchmesser) und y-achse anzahl, somit hat man eine größenverteilung, das problem dabei ist, ich kriege keine richtigen werte mit einheiten.
schau es dir doch mal an wenn du die zeit hast. ich häng dir noch ein bild an welches du auswerten kannst
es geht mir um die verteilung der korngößen auf dem bild ( Bsp. ein bild mit reiskörnern)
das programm das ich angehängt habe macht es schon richtig, man kriegt auf der x-achse die größe der körner ( mittlere durchmesser) und auf der y-achse die anzahl, somit hat man eine größenverteilung, das problem dabei ist, ich kriege keine richtigen werte mit einheiten.
schau es dir doch mal an wenn du die zeit hast. ich häng dir noch ein bild an welches du auswerten kannst
Ich denke nicht das dein Program auch nur im Ansatz macht was du moechtest. Wenn ich mir das Bild betrachte sehe ich etwa 30-50 Koerner, je nachdem ob verbundene Koerner nur 1 Korn ist oder eben mehrere. Schaust du dir jetzt mal die Anzahl deiner segmentierten Regionen an:
so sind es 311. Davon sind viele auch nur 1 Punkt gross! Ich denke es ist ein wenig mehr image processing noetig um wirklch erstmal die einzelnen Koerner zu segmentieren. Die Darstellung der Koernerverteilung ist dann eher die einfache Aufgabe.
ist das jetzt eine Frage oder nicht . Naja ich kann dir keine pauschale Loesung fuer dein Problem geben, da mir dazu schlichtweg die Zeit fehlt. Ich empfehle dir ein Image Processing Buch zu lesen bzw. im Internet nach derartigen Quellen zu suchen. Ich persoenlich kann die "Image Processing using Matlab" Serie empfehlen (Buch), dort werden Methoden der Bildverarbeitung am Beispiel von Matlab gezeigt.
Edit: Ok ich habe doch mal ein wenig rumprobiert, ich denke dies sollte ein guter Anfang sein:
Code:
img = imread('Metal_Bond_Micron_M1.jpg');
cannyImg = edge(rgb2gray(img),'canny'); % Kantendetektion
dilateImg = imdilate(cannyImg,strel('disk',2)); % versuche Loecher zu schliessen um geschlossene Konturen zu erhalten
fillHoles = imfill(dilateImg,'holes'); % fuelle Loescher
erodImg = imerode(fillHoles,strel('disk',2)); % verkleiner die Strukturen wieder um den "gleichen" Betrag die sie zuvor vergroessert wurden
clean = bwareaopen(erodImg,200,8); % entferne kleine Strukturen imshow(clean)
Verfasst am: 10.01.2014, 20:20
Titel: While-Schleife für Ausschnittwahl
Hallo,
da ich aus diesem Beitrag den Input bzgl. Bildausschnitte wählen entnommen habe, versuche ich meine Frage mal hier unterzubringen.
Für eine Bild Analyse von Schliffbildern mit Poren habe ich mich an einem kleinen Script probiert.
Es wandelt ein Bild in ein Binärbild und teilt es in Ausschnitte und beurteilt für jeden Ausschnitt den Schwarz/Weiß-Anteil.
Das If-Kritierium bzgl. b bzw. h = 0 könnt man vllt anders umsetzen, aber von Prinzip sollte es so passen.
Die innere while-Schleife (b) klappt auch und wenn ich h (=Spalte) festhalte, dann geht er brav die Zeile durch und arbeitet die Abschnitte ab. Also müsste die Idee an sich stimmen!?
Warum geht die äußere Schleife nicht? Kommt auch kein Syntaxfehler, nur MatLab hört vor der h-Schleife auf (sehe ich daran, weil er die davor deklarierten Variablen anlegt).
Das Script ist möglicherweise generell noch nicht so optimal, aber das ist erstmal bei meinem ersten MatLabversuch bei rumgekommen. So Sachen wie Daten in Matrix schreiben usw. werd ich noch einbringen.
Ich danke schonmal!
Grüße,
Philip
Code:
A = 'test-schliff.bmp';
B = imread(A, 'bmp');
C = im2bw(B);
hoehe = size(C,1);
breite = size(C,2);
hoeheklein_double = hoehe/7;
breiteklein_double = breite/5;
hoeheklein = int32(double(hoeheklein_double));
breiteklein = int32(double(breiteklein_double));
h=0;
b=0;
while h <= 6 if h == 0
y_start = 1
y_end = hoeheklein
while b <= 4 if b == 0
x_start = 1
x_end = breiteklein
else
x_start = x_start+breiteklein
x_end = x_end+breiteklein
end if y_end > hoehe
y_end = hoehe
else
y_end = y_end
end if x_end > breite
x_end = breite
else
x_end = x_end
end
Ausschnitt=C(y_start:y_end,x_start:x_end);
figure,imshow(Ausschnitt);
numwhitepixel = nnz(Ausschnitt==1);
ratio = numwhitepixel / numel(Ausschnitt);
eval([['Aus_' int2str(h),int2str(b)] '= ratio']);
clearvars Ausschnitt;
b=b+1;
end;
h=h+1;
else
y_start = y_start+hoeheklein
y_end = y_end+hoeheklein
while b <= 4 if b == 0
x_start = 1
x_end = breiteklein
else
x_start = x_start+breiteklein
x_end = x_end+breiteklein
end if y_end > hoehe
y_end = hoehe
else
y_end = y_end
end if x_end > breite
x_end = breite
else
x_end = x_end
end
Ausschnitt=C(y_start:y_end,x_start:x_end);
figure,imshow(Ausschnitt);
numwhitepixel = nnz(Ausschnitt==1);
ratio = numwhitepixel / numel(Ausschnitt);
eval([['Aus_' int2str(h),int2str(b)] '= ratio']);
clearvars Ausschnitt;
b=b+1;
end;
h=h+1;
end;
figure,imshow(C);
Es läuft! End vergessen gehabt und das Zurücksetzen der inneren Schleife.
Andere Frage:
Wenn ich mein "Raster" (einzelne Ausschnitte) über das Gesamtbild des Schliffbilds lege, dann werden die Ausschnitte in den Randbereichen der Probe auch die Bereiche mit in die Bewertung mit einbeziehen, welche sich garnicht auf der Probe befinden.
Was für Möglichkeiten gibt es diese Bereiche auszuschließen?
Vielen Dank
Einstellungen und Berechtigungen
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
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.