Verfasst am: 07.05.2011, 12:08
Titel: Extrahieren von Fehlern aus *.jpg
Hallo,
ich bin neu in diesen Forum, ich weis daher nicht ob es schon eine Lösung für folgendes Problem gibt. Des weiteren habe ich relativ begrenzte Matlabkenntnisse da ich mich erst seid wenigen Wochen intensiv mit den Programm auseinander setze.
In Rahmen einer Arbeit muss ich einige tausend *.jpg-Bilder auswerten. Da dies "per Hand" ziemlich aufwendig ist habe ich mich entschieden dafür Matlab zu nutzen, da mir das Programm zur Verfügung steht.
Die Fehler im Bild werden mir durch Farbunterschiede dargestellt.
Z.b. der fehlerfreie Hintergrund ist "türkis" und die Fehler sind "rosa" und "blaue" Pixel.
Die Eingabe und aufrufen der einzelnen Bilder ist nicht das Problem.
Mein Problem ist folgendes, wie kriege ich Matlab dazu:
1.- die Fehler auf dem Bild zu erkennen
Ich stelle mir da eine Art Abtastfunktion vor, die jeden Pixel ansteuert und diese mit den fehlerfreien Hintergrund vergleicht. (dabei ist es egal welche "Farbe" der Fehler hat)
2.- zu sagen wo der Fehler im Bild ist
Hier stell ich mir eine Art grobes Raster vor (z.b. das ganze Bild wird in 16 möglichst gleich große, quadratische Sektoren unterteilt) das man über das Bild legt und in Grunde die Fehler den Koordinaten des Rasters zuordnet und so die Position eindeutig bestimmt wird.
Am Ende reicht es mir wenn mir die Raster-Koordinaten der Fehler ausgegeben werden, da diese zur weiteren Auswertung benötig werden.
Ich hoffe ihr könnt euch vorstellen wo das Problem liegt.
Ich danke für jegliche Hilfe.
Grüße,
hurtz
_________________
"der Wolf,das Lamm ... auf der grünen Wiese ... HURTZ!"
also etwas "fertiges" habe ich noch noch nicht gesehen (was natürlich nichts heißen soll), aber einen Denkanstoß hätte ich schon. Du mußt zuerst Deinen Farbfehler exakt beschreiben. Ist Dein Farbfehler den Du suchst exakt 1 Farbwert oder ein "Bereich" von bis. Da die kleinste Einheit 1 Pixel ist, würde ich zunächst den Fehler als Farbpixel definieren. Das bedeutet, dass Du zu der gesuchten Farbe die exakten Farbwerte hast. Matlab wird sicherlich nicht nach türkis suchen können. ein Farbpixel kannst Du wie folgt definieren:
Diese Pixel müsste man dann suchen. Aber eine Suchfunktion habe ich leider auch nicht. Es sollte nur ein Denkanstoß sein. Ich dachte, es würde mit der Mustererkennung gehen, aber die macht in den mir bekannten Fällen aus einem Farbbild ein SW-Bild in der Suchfunktion.
Ich find den Ansatz nicht schlecht, danke schon mal dafür.
Es ist ja letztendlich der Ansatz zum ersten Schritt der Problemlösung.
Wie würde die Definition den Aussehen wenn es sich um ein Farbbereich handelt ?
Letztendlich ist es ja so das auf den Bildern ein ganzer Farbbereich betrachtet wird.
Mir ist auch gestern eine andere Idee eingefallen. Vielleicht ist es einfacher das Problem um zu drehen. Das man nicht die sprichwörtliche Nadel im Heuhaufen sucht, sondern einfach den Heuhaufen entfernt.
D.h. nicht die Pixel im ganzen Bild sucht, sondern das Bild nur noch auf diese "Fehler-Pixel" reduziert.
Ist es möglich alles was "grün" (bzw ein definierter Farbbereich) ist aus den Bild zu entfernen?
Wenn man das nehmlich hinkriegt kann man mit Mustererkennungen arbeiten, auch macht es in den reduzierten Bildern kein Unterschied mehr ob die Bilder schwarz-weis sind oder farbig, weil das was dann auf den Bild an Mustern zu sehen ist, ja letztendlich nur noch die Fehler dar stellen.
_________________
"der Wolf,das Lamm ... auf der grünen Wiese ... HURTZ!"
danke für die Funktion.
Mit der kann ich schon viel anfangen, da ich das nun so filtern kann, wie ich es brauche.
Im folgenden Beispiel wird nach "blauen" Fehlern gefiltert.
Code:
I=imread('bild.jpg');
C = colorfilter(I,'b');
for i=1:188;
for j=1:187;
r=C(i,j,1);
g=C(i,j,2);
b=C(i,j,3);
if r==b;
if g==b;
C(i,j,1:3)=255;
end end end end
imcontour(rgb2gray(C),1)
würde es nicht reichen, die Anzahl der gesuchten Pixel zu ermitteln, da sich aus der Anzahl der gefundenen Pixel zur Gesamtfläche auch eine Flächenberechnung ergibt?
danke für deine Hilfe.
Es hat sich leider heute gezeigt, das ich den falschen Ansatz gewählt habe um in mein Fall die Fehler zu extrahieren. Und somit was bisher war ansich nicht wirklich zur Lösung führt.
Man muss da komplett anders ran gehen.
Ich hab heute mit jemanden gesprochen der sich quasi professionell mit den Problem beschäfftigt das ich habe. Eine Lösung konnte er mir allerdings auch nicht nennen, nur Lösungsansätze.
Damit du diese aber verstehst, muss ich dir nächeres über die bilder erzählen.
Das Bild stellt eine Rauigkeitsmessung von Wafern dar, der prinzipielle Aufbau ist der Abbilung ähnlich.
Die Bilder die mir vorliegen sehen aus wie dieses, nur damit du eine Vorstellung hast.
(Die Pfeile in den Beispiel kannst du ignorieren.)
Die Fehler von den ich hier die ganze Zeit rede zeigen sich durch z.B. rote oder blaue Flecken innerhalb des "Farbspiel".
(bei den was ich mit deiner hilfe bisher gemacht ahbe kann er nicht zwischen Fehler und Farbgradienten unterscheiden, was letztendlich zu falschen Ergbenissen führt)
Eine Möglichkeit die er genannt hatte, wäre das "Farbspiel" im Hintergrund zu entfernen. Das Farbspiel ist nehmlich bei mir ein Gradientenverlauf, strahlenartig von innen nach aussen. Man könnte nun eine Funtkion suchen die den Gradientenverlauf simuliert.
Wenn man nun die Simulation vom eigentlichen Bild abzieht sind das was über bleibt die Fehler im Bild.
Das Bild räumlich dargestellt sieht also aus wie eine große Schüssel aus der einzelne Peaks hervorstechen. die Peaks sind die Fehler.
Die *.jpg die mir Vorliegen ist in Grunde die 2D-Abbildung dieser Schüssel, von oben drauf geschaut.
Ziel bei der Fehlerauswertung sollte es sein die Schüssel platt zu drücken und dann die Peaks zu betrachten.
Es ist leider nur sehr bescheuert das ich keine Legende zu mein Bildern zur Verfügung habe, ich kann also der Farbe kein eindeutigen Wert zuordnen was die Sache nicht gerade einfacher macht.
Eine andere Möglichkeit wäre es das bild zu linearisieren und eien Fourirtrasformation drüber laufen zu lassen und durch entfernen einzelner ourirkomponenten den Fehler zu extrahieren.
Trotz alle dem, ich danke dir für deine Hilfe.
Falls du immer noch eine Idee hast, immer raus mit der Sprache.
Grüße.
_________________
"der Wolf,das Lamm ... auf der grünen Wiese ... HURTZ!"
tolle Beschreibung! Mir ist schon klar, dass man ohne Kenntnis des Bildinhalts mit seinen Lösungen daneben liegen kann. Das liegt in der Natur der Sache und ist in der Kommunikation kein Problem. Ich habe Dir noch 2 Ansätze beigefügt, die den "Hintergrund" bearbeiten können. Alle Lösungen, sind irgendwann mal für einen bestimmten Bildinhalt geschrieben worden. Beim Übertragen auf andere Inhalte kann die Wirkung natürlich voll daneben gehen. Andererseits ist es von Vorteil, über eine Vielzahl von Funktionen Kenntnis zu haben, damit eine gewisse Vorstellung von der Leistungsfähigkeit der Verfahren vorhanden ist. Ich nutze Matlab zum überwiegenden Teil mit veröffentlichten Funktionen, da ich schnell zu einem best. Problem eine Lösung greifbar habe.
Ich habe die Info in ein M-File geschrieben. Auch an Dich der Hinweis, sollte das alles nicht greifen - weiter posten!
Der Hinweis auf die FFT kommt manchmal sehr schnell, wenn keine anderen Lösungen parat liegen. Nach meiner Erfahrung bringt das Verfahren nur im Aufkommen von Periodizitäten beste Ergebnisse. Alle anderen Verfahren lassen sich sehr oft auch im Ortsbereich umsetzen. Du wirst sehen, ob sich Deine Störsignale im FFT-Bild abheben. Dein Beispiel zeigt schräge Störstreifen, die sich vielleicht mit dieser Methode entfernen lassen.
Ein anderer Ansatz wäre, die Störsignale manuell zu beseitigen, in dem Du sie der Umgebung anpasst und das Ergebnis vom gestörten Bild abziehst. Übrig bleiben die Störungen.
Ist der enstsprechende Befehl das mir die Fourirtransformation für das Bild ausrechnet. Ich bin schon eine Weile am Überlegen wie ich darüber nun ein Filter legen kann, so das letztendlich nur noch die Störungen über bleiben.
_________________
"der Wolf,das Lamm ... auf der grünen Wiese ... HURTZ!"
das ungestörte Bild mußt Du natürlich aus Deinem gestörten Bild errechnen, in dem z.B. einen Gausschen TP-Filter darüber legst. Es kommt au fdie Ausmaße der Störung an, ob auch ein Median-Filter ausreicht. Ich habe so versucht, Dein Beispiel irgendwie nachzuvollziehen und das geht. Trotzdem gebe ich Dir eine Funktion für die FFT:
ich kenne mich in diesem Bereich leider nur sehr wenig aus. Aber hast du einmal versucht eine einfache Kantendetektion durchzuführen? Vielleicht liegt das jetzt auch voll daneben, aber wenn du einen Farbverlauf hast, dann sollten sich benachbarte Werte doch nur in einem relativ kleinen Rahmen unterscheiden (evtl. vorher in ein Grauwertbild umwandeln). Wenn du jetzt z.B. einen Sobel- oder Schar-Operator anwendest, dann sollte das entstehende Bild relativ gleichmäßig aussehen (keine richtigen Kanten vorhanden). An den unregelmäßigen Stellen erhältst du jedoch größere Zahlenwerte. Evtl. ist es nützlich das Ganze in x- und in y- Richtung durchzuführen und beide Ergebnisse zu überlagern.
Ich wollte nur einen weiteren Denkanstoß geben. Die Umsetzung sollte sehr einfach sein - vielleicht lohnt sich damit ein Test.
danke erstmal.
Ich kam in den letzten Tagen nicht dazu die neuen programme aus zu probieren.
Werd ich aber bei Gelegenheit mal machen, vielleicht heute Abend noch.
Auch ich hab inzwischen schon mit ein paar Filtern, fouriertransforamtionen und ähnlichen rumgespielt ... allerdings war ich bei den was ich bisher hatte nicht wirklich von überzeugt.
Die Farben auf den Bilder repräsentieren Messwerte.
Inzwischen wurde mir was zugeschickt das ich den Farben ein Wert zuordnen kann. z.B. weis ich nun das blau = 105 und rot=140 ist.
Das dumme ist nur die Skala die ich habe sind - ich sag mal - "diskreten" Farben, aber die Farben auf den aus zu wertenden bild sind "kontinuierliche" Farben.
gibt es eine Möglichkeit aus den 8 unterschiedlich diskreten Farben ein kontinuierliches Farbband das alle zwischenfarben enthält zu programmieren?Wobei die Reihenfolge der übergänge vorgegeben ist. (dies müsste man ja nur einmal machen und kann als Bild abgespecihert werden, auf den man dann immer wieder zugreift)
Dann könnte nehmlich die Lösung meines Problems wie folgt aussehen:
Ich konstruiere aus den Bild die "Messwerte" (die messwerte würde ich dann zwischen 0 und 10 oder so laufen lassen, spielt ja keine rolle welche hausnummern ich verwende), indem ich die Farben auf den Bild und auf der Skala vergleiche und entsprechend eine Zahl zuordne.
die so enstehende Zahl bzw. Matrix z(x,y) (wobei x,y die positionen auf den Bild sind) lass ich mir in ein 3D-Plot darstellen. Die Fehlstellen zeigen sich dann durch Maximas und Minimas.
Legt man dann eine Interpolation P(x,y) über das ganze Konstrukt ... müssten sich die Positionen berechnen lassen. (grad(P) = 0)
So wäre das Problem der Lokalisierung gelöst.
Die Zuordnung der Fehler kann man eventuell bei bekannten Positionen dann leichter machen, indem man die Umgebungen der Positionen betrachtet.
_________________
"der Wolf,das Lamm ... auf der grünen Wiese ... HURTZ!"
S='Skala.jpg';
%Pfad zur Farbskala
Skala=imread(S);
%Skala einlesen
Gb=size(Bild);
%Größe des Bildes
Gs=size(Skala);
%Größe der Skala
W=0:Gs(2);
%werte der Skala
for a=1:Gb(1);
for b=1:Gb(2);
for c=1:Gs(2);
if Bild(a,b,1:3)==Skala(30,c,1:3);
z(:,:)=W(c);
else
z(:,:)=0;
end
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.