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

Optimierung von Bildern für ImageProcessingToolbox

 

dabauer82
Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 06.01.2011, 14:15     Titel: Optimierung von Bildern für ImageProcessingToolbox
  Antworten mit Zitat      
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 Smile

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?

Danke

Code:
function W = Erkennung(ImageFile)

%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);

% 2. Bezeichnungen einfügen
S3 = bwlabel(S2);
imagesc(S3);



%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

for cnt = 1:length(S4)
score1(cnt) = abs(1-(S4(cnt).MajorAxisLength-S4(cnt).MinorAxisLength)...
/max([S4(cnt).MajorAxisLength,S4(cnt).MinorAxisLength]));
score2(cnt) = abs(1 - abs(pi*((mean([S4(cnt).MajorAxisLength,...
S4(cnt).MinorAxisLength]))/2)^2-S4(cnt).Area)/S4(cnt).Area);
score3(cnt) = abs(1 - abs(pi*(max([S4(cnt).MajorAxisLength,...
S4(cnt).MinorAxisLength]))-S4(cnt).Perimeter)/S4(cnt).Perimeter);
end
score = mean([score1;score2;score3]);

%5. Ausgabe der Werte in Bild

imshow(S2)
for cnt = 1:length(S4)
text(S4(cnt).Centroid(1),S4(cnt).Centroid(2),['Score: ',num2str(score(cnt))],'color','red');
text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)+10,['MaxA: ',num2str(S4(cnt).MajorAxisLength)],'color','green');
text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)+20,['MinA: ',num2str(S4(cnt).MinorAxisLength)],'color','yellow');
text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)+40,['Mitt: ',num2str((S4(cnt).MinorAxisLength+S4(cnt).MajorAxisLength)/2)],'color','yellow');
%text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)+30,['MaxI: ',num2str(S4(cnt).MajorAxisLength)],'color','green');
%text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)+40,['MinI: ',num2str(S4(cnt).MinorAxisLength)],'color','yellow');
%text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)-10,['Area: ',num2str(S4(cnt).Area)],'color','cyan');
%text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)-20,['Peri: ',num2str(S4(cnt).Perimeter)],'color','blue');
text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)+30,['Equi: ',num2str(S4(cnt).EquivDiameter)],'color','blue');
end
W = S4;
end


test1.jpg
 Beschreibung:

Download
 Dateiname:  test1.jpg
 Dateigröße:  60.95 KB
 Heruntergeladen:  623 mal
Private Nachricht senden Benutzer-Profile anzeigen


Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 06.01.2011, 14:46     Titel:
  Antworten mit Zitat      
Moin,

dazu gibt es viele Wege. Eine schnelle Möglichkeit wäre ein HP-Filter, den Du mittels Filterkern adaptiv anwenden kannst, z.B.

1/9*[-1 -1 -1;-1 10 -1;-1 -1 -1]; % Mitte = 10 evtl. ändern.

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:

http://www.ece.eps.hw.ac.uk/~ceeyrp.....torials/SimpleFiltering.m

Viele Grüße

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
dabauer82
Themenstarter

Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 10.01.2011, 10:28     Titel:
  Antworten mit Zitat      
Hallo Hubertus,

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?

Grüße,
dabauer82

Code:
function W = Erkennung(ImageFile)

%1. Ausgangsbild einlesen und in ein binäres Bild konvertieren

RGB = imread(ImageFile);        % RGB einlesen
figure, imshow(RGB), title('Original Image');

GRAY = rgb2gray(RGB);           % RGB in GRAY
figure, imshow(GRAY), title('Gray Image');

threshold = graythresh(GRAY);
S = im2bw(GRAY, threshold);    % in Binär
figure, imshow(S), title('Binary Image');

S2 = ~S;                        % Invertieren
figure, imshow(S2), title('Inverted Binary Image');

Sfilter = Filter(S2,1,1);

% 2. Bezeichnungen einfügen
S3 = bwlabel(S2);
imagesc(S3);



%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

for cnt = 1:length(S4)
score1(cnt) = abs(1-(S4(cnt).MajorAxisLength-S4(cnt).MinorAxisLength)...
/max([S4(cnt).MajorAxisLength,S4(cnt).MinorAxisLength]));
score2(cnt) = abs(1 - abs(pi*((mean([S4(cnt).MajorAxisLength,...
S4(cnt).MinorAxisLength]))/2)^2-S4(cnt).Area)/S4(cnt).Area);
score3(cnt) = abs(1 - abs(pi*(max([S4(cnt).MajorAxisLength,...
S4(cnt).MinorAxisLength]))-S4(cnt).Perimeter)/S4(cnt).Perimeter);
end
score = mean([score1;score2;score3]);

%5. Ausgabe der Werte in Bild

figure, imshow(S2), title('Labeled Binary Image');
for cnt = 1:length(S4)
text(S4(cnt).Centroid(1),S4(cnt).Centroid(2),['Score: ',num2str(score(cnt))],'color','red');
text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)+10,['MaxA: ',num2str(S4(cnt).MajorAxisLength)],'color','green');
text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)+20,['MinA: ',num2str(S4(cnt).MinorAxisLength)],'color','yellow');
text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)+40,['Mitt: ',num2str((S4(cnt).MinorAxisLength+S4(cnt).MajorAxisLength)/2)],'color','yellow');
%text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)+30,['MaxI: ',num2str(S4(cnt).MajorAxisLength)],'color','green');
%text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)+40,['MinI: ',num2str(S4(cnt).MinorAxisLength)],'color','yellow');
%text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)-10,['Area: ',num2str(S4(cnt).Area)],'color','cyan');
%text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)-20,['Peri: ',num2str(S4(cnt).Perimeter)],'color','blue');
text(S4(cnt).Centroid(1),S4(cnt).Centroid(2)+30,['Equi: ',num2str(S4(cnt).EquivDiameter)],'color','blue');
end
W = S4;
end


test1.jpg
 Beschreibung:

Download
 Dateiname:  test1.jpg
 Dateigröße:  60.95 KB
 Heruntergeladen:  632 mal
Filter.m
 Beschreibung:

Download
 Dateiname:  Filter.m
 Dateigröße:  1.6 KB
 Heruntergeladen:  525 mal
Erkennung.m
 Beschreibung:
Startdatei

Download
 Dateiname:  Erkennung.m
 Dateigröße:  2.54 KB
 Heruntergeladen:  590 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
dabauer82
Themenstarter

Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 10.01.2011, 10:46     Titel:
  Antworten mit Zitat      
Neuer Scan:

0001.jpg
 Beschreibung:

Download
 Dateiname:  0001.jpg
 Dateigröße:  7.99 KB
 Heruntergeladen:  561 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 10.01.2011, 14:04     Titel:
  Antworten mit Zitat      
Moin dabauer82,

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.

http://www.mathworks.com/help/toolbox/images/ref/nlfilter.html

Ein guter Filter für Deine Vorlage ist auch der Hybrid-Filter:

http://www.mathworks.com/matlabcent.....5-hybrid-median-filtering

Code:
I=imread(Bild);
f=@(x)max(x(:));
I2=nlfilter(I,[30 10],f);
imshow(I2)


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.

Viele Grüße und viel Erfolg

Hubertus
[/code]
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 11.01.2011, 08:08     Titel:
  Antworten mit Zitat      
Moin dabauer82,

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!!

http://www.csse.uwa.edu.au/~pk/Rese.....gments/example/index.html

In dem Bereich von Peter Kovesi findest Du weitere Beispiele zur edge-Funktion.

Viele Grüße

Hubertus

Edit.

Die Funktion tv_denoise stammt von folgender Seite:

http://www.mathworks.com/matlabcent.....toration-and-segmentation
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 11.01.2011, 13:46     Titel:
  Antworten mit Zitat      
Da bin ich noch einmal,

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:

Code:
I=imread(Bild);
m=I(:,:,1)>110 & I(:,:,2)>110 & I(:,:,3)>110;
imshow(m)


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.

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
dabauer82
Themenstarter

Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 12.01.2011, 08:32     Titel:
  Antworten mit Zitat      
Mensch Hubertus,

jetzt schau ich zwei Tage mal hier nicht rein, und du überrascht mich ohne Ende Smile


Wahnsinn, vielen Dank. Ich werde alle deine Ratschläge probieren und dich/euch dann wissen lassen, welche Lösung für mich die beste ist.

Vielen, vielen dank!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 12.01.2011, 08:37     Titel:
  Antworten mit Zitat      
Moin dabauer82,

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.

Viele Grüße
Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 12.01.2011, 14:12     Titel:
  Antworten mit Zitat      
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.08 0.3]);


Du siehst jetzt Kreise mit noch verbliebenen Störungen, die sich am Schnellsten beseitigen lassen, wenn Du sie einfach auf "0" setzt.

Code:
I2(60:215,260:732)=0;
% entfernt den oberen Teilkreis

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

Hubertus

nach tv_denoise.jpg
 Beschreibung:

Download
 Dateiname:  nach tv_denoise.jpg
 Dateigröße:  42.5 KB
 Heruntergeladen:  582 mal
Nach canny.fig
 Beschreibung:

Download
 Dateiname:  Nach canny.fig
 Dateigröße:  56.53 KB
 Heruntergeladen:  522 mal
Einige Störungen entfernt.fig
 Beschreibung:

Download
 Dateiname:  Einige Störungen entfernt.fig
 Dateigröße:  12.99 KB
 Heruntergeladen:  503 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
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.