Verfasst am: 06.01.2011, 14:15
Titel: Optimierung von Bildern für ImageProcessingToolbox
Hallo Forum,
ich habe mir ein Script gebastelt, mit dem ich den Mittelpunkt und den kürzesten und längsten Durchmesser einer Kreises finden kann. Das funktioniert auch sehr gut, wenn man sich eine Ausgangsgrafik mit Paint oder weiß der Geier was bastelt.
Jetzt habe ich aber versucht mein Script auf den Anwendungsfall anzuwenden, und siehe da, nichts gehts mehr
Im Anhang findet ihr ein Bild, welches mein kreisform mit Innen und Außenradius zeigt. Wie muss ich so ein Bild indealerweise einscannen bzw bearbeiten, dass es sauber erkannt wird. Sowohl Innenkreis als auch Außenkreis?
%1. Ausgangsbild einlesen und in ein binäres Bild konvertieren
S = imread(ImageFile); % RGB einlesen
S = im2bw(S); % in Binär
S2 = ~S; % Invertieren imshow(S2);
%3. Eigenschaften der Objekte auslesen
S4 = regionprops(S3,'MinorAxisLength','MajorAxisLength','Area','Perimeter','centroid','EquivDiameter');
%4. Evaluierung der gefundenen Objekte anhand ihrer Eigenschaften:
% - Längste und kürzeste Verbindung/Durchmesser, % - Vergleich der Fläche mit Kreisfläche pi*r^2. % - Vergleich Umfang mit 2*pi*r % - Normierung des Scores: 1 ist idealer Kreis
Den Kern kannst Du ändern wenn Deine Kreise nicht geschlossen erscheinen. Ich würde das nicht auf ein RGB anwenden, sondern entweder auf ein Graubild oder nur einen bevorzugten Farbkanal. Verbleibendes Rauschen, das stört, lässt sich durch einen TP-Filter oder Median-Filter
reduzieren. Du mußt probieren, was am besten paßt. Die andere Möglichkeiten wären dann morph. Anwendungen. Die größte Schwierigkeit besteht wohl aus den Halbtönen geschlossene Kreise zu erzeugen, ohne dass da irgendwelche Lücken entstehen.
Einen HP und TP Filter im Frequenzbereich findest Du hier:
ich kenne mich mit der Bildbearbeitung leider noch nicht gut genug aus. Deinen Hinweis habe ich dennoch versucht einzubauen - jedoch versteh ich dessen Einsatz nicht richtig.
Ich habe Dir/Euch unten meinen neuen Code angefügt. Vielleicht kannst du kurz das Script bei dir durchjagen? Ansonsten bin ich für Literatur auch immer dankbar.
Ich kann natürlich auch versuchen, eine bessere Ausgangsquelle zu bekommen. GGf durch abfotografieren oder anderes einscannen.
Was meinst du dazu?
%3. Eigenschaften der Objekte auslesen
S4 = regionprops(S3,'MinorAxisLength','MajorAxisLength','Area','Perimeter','centroid','EquivDiameter');
%4. Evaluierung der gefundenen Objekte anhand ihrer Eigenschaften:
% - Längste und kürzeste Verbindung/Durchmesser, % - Vergleich der Fläche mit Kreisfläche pi*r^2. % - Vergleich Umfang mit 2*pi*r % - Normierung des Scores: 1 ist idealer Kreis
ich habe erst jetzt die Gelegenheit gehabt, Dein Bild auf einen Matlab-Rechner zu laden. Es bleibt nur das Rumprobieren, wenngleich mit genauen Zielvorgaben. Ich habe nur ein Graubild verwendet, da die Farbinfo kaum von Bedeutung ist.
Du hast im Bild 2 Probleme. Einerseits einen erheblichen Rauschanteil, der in seiner Beschaffenheit ein Problem für Rauschfilter ist. Ich habe mehrere Filter angewendet und das beste Resultat mit einem "tv_denoise.m"-Filter erhalten.
Zuerst solltest Du das Rauschen im Rad so weit dämpfen, dass Du eine glatte Oberfläche erhältst - ohne dass Deine Kanten verschmieren. Schau mal, ob Du den Filter noch irgendwo herunter laden kannst, oder probiere andere TP-Filter, Wenn Du da nicht weiter kommst, kann ich den Filter wohl noch liefern. Ich muß das immer abtippen, weil keine Verbindung zum Netz.
Der Wert für den Filter (Parameterübergabe) liegt bei ca. 0.8. Danach hast Du ein völlig rauschfreies Bild mit einer guten Kantendarstellung der Kreise und siehst weiterhin, wo das nächste Problem liegt, nämlich die Schattenwürfe, die sich an den Kreis anschließen.
Auf das entrauschte Bild habe ich den nlfilter angewendet.
Dann kommst Du in einen Bereich, an dem Du selber sehen mußt, mit welcher Lösung Du zufrieden bist. Ich glaube, dass man ab dem entrauschten Bild mit morph. Verfahren auch weiter kommt. Da habe ich aber zuwenig Kenntnisse. Es gibt hier User, die auf diesem Gebiet richtig gut sind. Vielleicht hat ja einer noch eine andere Lösung. Wenn ich Dir irgendwie noch weiterhelfen kann, melde Dich.
Sollest Du das Bild noch einmal scannen können, achte darauf, dass Du möglichst wenig Konstraste erzielst. Die hohen Kontraste verstärken das Rauschen. Erst nach dem Entrauschen, wenn die Störungen weg sind, kann man wieder hohe Kontraste gebrauchen.
hier noch ein kurzer Anhang von gestern. Nach dem völligen Entrauschen mit "tv_denoise" (das Bild sollte richtig "platt" sein), bringt auch dieses Beispiel zur Weiterverarbeitung ein sehr gutes Resultat - es hängt von der Qualität des entrauschten Bildes ab!!
ich habe es ja schon erwähnt, dass es sehr viele Wege gibt. Es gibt aber auch einen sehr einfachen, ich denke, sogar verblüfffend einfach. Ich habe folgende Funktion auf Dein Bild angewendet, ohne es vorher zu entrauschen:
Ich denke, mit den Funktionen in diesem Thread müßtest Du irgendwie Dein Ziel erreichen können. Wenn Du etwas besseres findest, kannst Du es ja posten, würde mich interessieren.
ich war gestern etwas zu schnell und zu optimistisch. Mir ist da ein Fehler unterlaufen, den ich gerade wieder wegbügel. Ich werde Dir heute abend Bilder und den Weg dorthin zum Nachvollziehen senden. Bis irgendwann.
Da bin ich wieder. Ich habe mich nur darauf konzentriert, aus Deinem Bild Kreise zu detektieren - habe Deinen Algo. leider nicht probieren können, da ich erhebliche Schwierigkeiten mit dem Austausch von Daten zum Matlab-Rechner habe.
Der erste Schrit war, die Störungen in dem Bild "platt zu bügeln". Das geht mit dem tv_denoise sehr gut. Das Ergebnisbild ist wichtig für die 'canny'-Funktion.
Code:
I=imread(Erg. aus tv_denoise);
I2=edge(I,'canny',[0.080.3]);
Mit dieser Methode lassen sich alle Störungen entfernen. Ich glaube es wird schwer, diesen Part mit autom. Funktionen auszugestalten. Deine Störungen im Originalbild haben nämlich auch Werte der zu detektieren Kreise.
Der Rest könnte noch mit der Funktion "strel" und dazugehörigen Operationen geringfügig verbessert werden, z.B. kleine Lücken in den Kreisen schließen.
Wenn Du noch Fragen hast, weißt Du, wo Du uns finden kannst. Bis dahin-
viel Glück
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.