Um nur schwarze Farbe in Matlab in Weiß zu konvertieren

8

Ich kenne das Thread über Konvertieren von schwarzer Farbe zu weiß und weiß zu schwarz gleichzeitig. Ich möchte nur Schwarz in Weiß umwandeln. Ich weiß das thread über das, was ich verlange, aber ich verstehe nicht, was schief läuft.

Bild

Code

%Vor%

Was gibt

Wo im roten Farbkanal etwas nicht stimmt. Die schwarze Farbe ist nur (0,0,0) in RGB, daher sollte die Entfernung jedes (0,0,0) Pixel zu weiß (255,255,255) machen. Mach diese Idee mit

%Vor%

Gibt

Ich muss also etwas in Matlab falsch verstanden haben. Die blaue Farbe sollte kein Schwarz haben. Also das letzte Bild ist seltsam.

Wie können Sie nur schwarze Farbe in Weiß umwandeln? Ich möchte die blaue Farbe des EKGs behalten.

    
Léo Léopold Hertz 준영 22.04.2015, 14:04
quelle

4 Antworten

5

Was ist das Problem?

Sie möchten alle schwarzen Teile des Bildes erkennen, aber sie sind nicht wirklich schwarz

Beispiel:

Ihre Idee (oder Ihr Code):

Zuerst digitalisierst du das Bild und wählst die Pixel aus, die etwas gegen die Pixel sind, die es nicht sind. Kurz gesagt, Sie tun: if pixel>level; pixel is something

Deshalb gibt es ein kleines Missverständnis, das Sie hier haben! wenn du schreibst

%Vor%

sollte es lesen

%Vor%

Daher, wenn Sie

tun %Vor%

Sie machen

%Vor%

Was Sie also bekommen sollten, ist ein komplett weißes Bild. Das Bild ist nicht vollständig weiß, weil es einige Pixel gab, die als "nicht etwas, Teil des Hintergrunds" durch den Wert von level gekennzeichnet wurden, im Falle eines Bildes um 0.6.

Eine Lösung, die man sich vorstellen kann, ist das manuelle Einstellen des Pegels auf 0,05 oder ähnlich, so dass nur schwarze Pixel in der grauen bis binären Threeholding ausgewählt werden. Aber das wird nicht 100% funktionieren, wie Sie sehen können, haben die Zahlen einige sehr "keine schwarze" Werte.

Wie würde ich versuchen, das Problem zu lösen:

Ich würde versuchen, die gewünschte Farbe zu finden, nur diese Farbe aus dem Bild zu extrahieren und dann Ausreißer zu löschen.

Extrahiere blau mit HSV (ich glaube, ich habe dir irgendwo anders gesagt, wie man HSV benutzt).

%Vor%

Hier möchten wir den größten blauen Teil bekommen, und das wäre unser Signal. Daher scheint der beste Ansatz darin zu bestehen, zuerst das Bild zu digitalisieren, indem man alle blauen Pixel

nimmt %Vor%

Und dann mit bwlabel , beschriften Sie alle unabhängigen Pixel "Inseln".

%Vor%

Das am meisten wiederholte Etikett ist das Signal. Also finden wir es und trennen den Hintergrund von dem Signal mit diesem Label.

%Vor%

Hier gibt es ein Diagramm mit dem Signal, dem Hintergrund und der Differenz (mit der gleichen Gleichung wie @rayryang)

    
Ander Biguri 22.04.2015, 14:57
quelle
7

Wenn ich Sie richtig verstehe, möchten Sie das blaue EKG-Diagramm extrahieren, während Sie den Text und die Achsen entfernen. Der beste Weg dazu wäre, den HSV-Farbraum des Bildes zu untersuchen. Der HSV-Farbraum ist genau so gut für anspruchsvolle Farben wie die Menschen. Wir können deutlich sehen, dass es im Bild zwei verschiedene Farben gibt.

Wir können das Bild mithilfe von rgb2hsv in HSV konvertieren und die Komponenten untersuchen separat. Die Farbtonkomponente stellt die dominierende Farbe des Pixels dar, die Sättigung bezeichnet die Reinheit oder wie viel weißes Licht in dem Pixel vorhanden ist und der Wert repräsentiert die Intensität oder Stärke des Pixels.

Versuchen Sie, jeden Kanal zu visualisieren:

%Vor%

Hmm ... naja, der Farbton und die Sättigung helfen uns überhaupt nicht. Es sagt uns, dass die dominante Farbe und Sättigung die gleichen sind ... aber was sie unterscheidet, ist der Wert . Wenn Sie sich das Bild rechts ansehen, können wir sie an der Stärke der Farbe unterscheiden. Was uns also sagt ist, dass die "schwarzen" Pixel tatsächlich blau sind, aber fast keine Stärke haben.

Wir können das tatsächlich zu unserem Vorteil nutzen. Alle Pixel, deren Werte über einem bestimmten Wert liegen, sind die Werte, die wir behalten möchten.

Versuchen Sie, einen Schwellenwert festzulegen ... etwas wie 0.75 . Der dynamische Bereich der HSV-Werte von MATLAB ergibt sich aus [0-1] , also:

%Vor%

Wenn wir die Wertkomponente schwellen, erhalten wir Folgendes:

Es gibt offensichtlich ein bisschen Quantisierungsrauschen ... besonders um die Achsen und die Schriftart herum. Als nächstes mache ich eine morphologische Erosion , so dass ich das Quantisierungsrauschen eliminieren kann, das sich um jede der Zahlen und Achsen befindet. Ich werde es die Maske ein bisschen groß machen, um sicherzustellen, dass ich dieses Geräusch entferne. Verwenden der Bildverarbeitungs-Toolbox:

%Vor%

Wir bekommen das:

Schön, ich mache jetzt eine Kopie Ihres Originalbildes und setze dann jedes Pixel, das schwarz ist, von der Maske, die ich abgeleitet habe (oben), im Finale auf Weiß Bild. Alle anderen Pixel sollten intakt bleiben. Auf diese Weise können wir jeden Text und alle Achsen entfernen, die in Ihrem Bild zu sehen sind:

%Vor%

Ich muss die Maske in der dritten Dimension replizieren, weil dies ein Farbbild ist und ich jeden Kanal an denselben räumlichen Positionen auf 255 setzen muss.

Wenn ich das mache, bekomme ich Folgendes:

Jetzt werden Sie feststellen, dass im Graphen Lücken vorhanden sind, die aufgrund des Quantisierungsrauschens zu erwarten sind. Wir können etwas weiter machen, indem wir dieses Bild in Graustufen und Schwellenwerte umwandeln und dann die Kanten durch eine morphologische Dilatation miteinander verbinden. Das ist sicher, weil wir die Achsen und den Text bereits eliminiert haben. Wir können dies dann als eine Maske verwenden, um in das ursprüngliche Bild zu indizieren, um unser endgültiges Diagramm zu erhalten.

In etwa so:

%Vor%

I schwelle das vorherige Bild, das wir ohne den Text und die Achsen erhalten haben, nachdem ich es in Graustufen umgewandelt habe, und führe dann eine Dehnung mit einem Linie strukturierenden Element durch, das 90 Grad ist, um diese Linien zu verbinden die ursprünglich getrennt waren. Dieses mit einem Schwellenwert versehene Bild enthält die Pixel, die wir letztendlich aus dem Originalbild abtasten müssen, damit wir die benötigten Diagrammdaten erhalten können.

Ich nehme dann diese Maske, repliziere sie, mache ein komplett weißes Bild und sample dann aus dem Originalbild und lege die gewünschten Stellen aus dem Originalbild in das weiße Bild.

Das ist unser letztes Bild:

Sehr nett! Ich musste all diese Bildverarbeitung machen, weil dein Bild grundsätzlich mit Quantisierungsrauschen anfängt, also wird es etwas schwieriger sein, den Graphen komplett zu bekommen. Ander Biguri in seiner Antwort ausführlicher über Farbquantisierungsrauschen erklärt, so überprüfen Sie sicherlich seine Post für weitere Details.

Als qualitatives Maß können wir jedoch dieses Bild vom ursprünglichen Bild abziehen und sehen, was übrig ist:

%Vor%

Wir bekommen:

Es sieht so aus, als ob die Achsen und der Text gut entfernt sind, aber es gibt einige Spuren in der Grafik, die wir nicht aus dem Originalbild aufgenommen haben, und das macht Sinn. Es hat alles mit den richtigen Schwellen zu tun, die Sie auswählen möchten, um die Diagrammdaten zu erhalten. Es gibt einige Problemstellen am Anfang des Diagramms, und das liegt wahrscheinlich an der morphologischen Verarbeitung, die ich gemacht habe.Dieses Bild, das Sie zur Verfügung gestellt haben, ist ziemlich kompliziert mit dem Quantisierungsrauschen, daher wird es sehr schwierig sein, ein perfektes Ergebnis zu erzielen. Außerdem sind diese Schwellenwerte leider alle heuristisch, also spielen Sie mit den Grenzwerten herum, bis Sie etwas bekommen, das mit Ihnen übereinstimmt.

Viel Glück!

    
rayryeng 22.04.2015 15:06
quelle
3

Hier ist eine Variation von @ rayryengs Lösung , um das blaue Signal zu extrahieren:

%Vor%

Um eine bessere Ansicht zu erhalten, ist hier die erkannte Maske über dem Originalbild (ich benutze imoverlay Funktion aus dem Dateiaustausch):

%Vor%

    
Amro 29.04.2015 22:52
quelle
1

Hier ist ein Code dafür:

%Vor%

black ist der Bereich, der die schwarzen Pixel enthält. Diese Pixel sind in jedem Farbkanal auf Weiß eingestellt.

In Ihrem Code verwenden Sie einen Schwellenwert und ein Graustufenbild, also haben Sie natürlich einen viel größeren Bereich von Pixeln, der auf weiß eingestellt ist. rote Farbe. In diesem Code werden nur Pixel, die absolut kein Rot, Grün und Blau enthalten, auf Weiß gesetzt.

Der folgende Code macht dasselbe mit einem Schwellenwert für jeden Farbkanal:

%Vor%     
Thomas Sablik 22.04.2015 14:48
quelle