Bildverbesserung in Python

Lassen Sie mich dieses Tutorial beginnen, indem Sie theoretischen Fachjargon aus dem Weg räumen. Wenn wir darüber reden Bildverbesserung, Dies bedeutet im Wesentlichen, dass wir eine neue Version des Bildes wünschen, die besser geeignet ist als die ursprüngliche. 

Wenn Sie beispielsweise ein Dokument scannen, hat das Ausgabebild möglicherweise eine schlechtere Qualität als das ursprüngliche Eingabebild. Wir brauchen daher einen Weg, um die Qualität der Ausgabebilder zu verbessern, damit sie für den Betrachter visuell ausdrucksstärker sind. Hier kommt die Bildverbesserung ins Spiel. Wenn wir ein Bild verbessern, schärfen wir die Bildmerkmale wie Kontrast und Kanten.

Es ist wichtig zu beachten, dass die Bildverbesserung nicht den Informationsgehalt des Bildes erhöht, sondern vielmehr den dynamischen Bereich der ausgewählten Merkmale erhöht, was schließlich die Qualität des Bildes erhöht. Also wissen wir hier eigentlich nicht, wie das Ausgabebild aussehen würde, aber wir sollten (subjektiv) erkennen können, ob es Verbesserungen gab oder nicht, wie etwa das Beobachten von mehr Details im Ausgabebild.

Die Bildverbesserung wird normalerweise als Vorverarbeitungsschritt in den grundlegenden Schritten der digitalen Bildverarbeitung (d. H. Segmentierung, Darstellung) verwendet. Es gibt viele Techniken zur Bildverbesserung, aber ich werde in diesem Tutorial zwei Techniken behandeln: Bild invers und Machtgesetz Transformation. Wir werden sehen, wie wir sie in Python implementieren können. Also lasst uns anfangen!

Bild invers

Wie Sie vielleicht aus dem Titel dieses Abschnitts erraten haben (was auch als bezeichnet werden kann) Bildnegation), inverses Bild zielt darauf ab, die dunklen Intensitäten im Eingabebild in helle Intensitäten im Ausgabebild und helle Intensitäten im Eingabebild in dunkle Intensitäten im Ausgabebild umzuwandeln. Mit anderen Worten, die dunklen Bereiche werden heller und die hellen Bereiche werden dunkler.

Sag das Ich (ich, j) bezieht sich auf den Intensitätswert des Pixels, der sich bei befindet (i, j). Um dies etwas zu verdeutlichen, fallen die Intensitätswerte im Graustufenbild in den Bereich [0,255], und (i, j) bezieht sich auf die Zeilen- bzw. Spaltenwerte. Wenn Sie den Bildumkehroperator auf ein Graustufenbild anwenden, wird das Ausgabepixel verwendet O (i, j) Wert wird sein:

O (i, j) = 255 - I (i, j)

Heutzutage sind die meisten unserer Bilder Farbbilder. Diese Bilder enthalten drei Kanäle, rot, Grün, und Blau, bezeichnet als RGB Bilder. In diesem Fall müssen wir im Gegensatz zur obigen Formel die Intensität von subtrahieren jeder Kanal von 255. Das Ausgabebild hat also die folgenden Werte in Pixel (i, j):

O_R (i, j) = 255 - R (i, j) O_G (i, j) = 255 - G (i, j) O - B) i, j) = 255 - B (i, j)

Nach dieser Einführung wollen wir sehen, wie wir den Operator für inverse Bilder in Python implementieren können. Ich möchte erwähnen, dass ich den Operator der Einfachheit halber mit einem Graustufenbild ausführen möchte. Aber ich werde Ihnen einige Gedanken darüber geben, wie Sie den Operator auf ein Farbbild anwenden, und ich werde Ihnen das gesamte Programm als Übung überlassen.

Das erste, was Sie für ein Farbbild tun müssen, ist den Intensitätswert jedes Pixelkanals (d. H. RGB) zu extrahieren. Zu diesem Zweck können Sie die Python Imaging Library (PIL) verwenden. Laden Sie ein Beispiel-Pavian-Bild von baboon.png herunter. Die Größe des Bildes beträgt 500 x 500. Angenommen, Sie möchten die roten, grünen und blauen Intensitätswerte an der Pixelposition extrahieren (325, 432). Dies kann wie folgt durchgeführt werden:

aus PIL importieren Image im = Image.open ('baboon.png') print im.getpixel ((325,432))

Anhand der Dokumentation, wie die Methode aussieht getpixel () tut ist:

Gibt den Pixelwert an einer bestimmten Position zurück.

Nachdem Sie das obige Skript ausgeführt haben, werden Sie feststellen, dass Sie nur das folgende Ergebnis erhalten: 138! Aber wo sind die RGB-Intensitätswerte der drei Kanäle? Das Problem scheint mit der Modus des gelesenen Bildes. Überprüfen Sie den Modus, indem Sie die folgende Anweisung ausführen:

Druck im.Modus

Sie erhalten die Ausgabe P, Dies bedeutet, dass das Bild in einem Palettenmodus gelesen wurde. Sie können das Bild in den RGB-Modus konvertieren, bevor Sie die Intensitätswerte der verschiedenen Kanäle zurückgeben. Dazu können Sie die Konvertieren() Methode wie folgt:

rgb_im = im.convert ('RGB')

In diesem Fall würden Sie den folgenden Wert erhalten: (180, 168, 178). Dies bedeutet, dass die Intensitätswerte für die roten, grünen und blauen Kanäle 180, 168 bzw. 178 sind.

Um alles, was wir bisher beschrieben haben, zusammenzustellen, sieht das Python-Skript, das die RGB-Werte eines Bildes zurückgeben würde, folgendermaßen aus:

aus PIL importieren Image im = Image.open ('baboon.png') rgb_im = im.convert ('RGB') print rgb_im.getpixel ((325,432))

Es gibt noch einen Punkt, bevor Sie zum Operator für inverse Bilder wechseln. Das obige Beispiel zeigt, wie der RGB-Wert von abgerufen wird ein Nur Pixel, aber wenn Sie den inversen Operator ausführen, müssen Sie dies auf durchführen alles die Pixel. 

Um alle Intensitätswerte für die verschiedenen Kanäle jedes Pixels auszudrucken, haben Sie folgende Möglichkeiten:

aus PIL importieren Image im = Image.open ('baboon.png') rgb_im = im.convert ('RGB') width, height = im.size für w in range (width): für h in range (height): print rgb_im.getpixel ((w, h))

An dieser Stelle möchte ich es Ihnen als Übung überlassen, herauszufinden, wie Sie den Bildumkehroperator auf alle Farbbildkanäle (d. H. RGB) jedes Pixels anwenden können.

Schauen wir uns ein Beispiel an, das den Operator für inverse Bilder auf ein Graustufenbild anwendet. Laden Sie boat.tiff herunter, das in diesem Abschnitt als Testbild dient. So sieht es aus:

Ich werde das verwenden scipy Bibliothek für diese Aufgabe. Das Python-Skript zum Anwenden des inversen Bildoperators für das obige Bild sollte folgendermaßen aussehen:

import scipy.misc aus scipy import misc aus scipy.misc.pilutil import Image Im = Image.open ('boat.tiff') im_array = scipy.misc.fromimage (im) im_inverse = 255 - im_array im_result = scipy.misc.toimage (im_inverse) misc.imsave ('result.tiff', im_result)

Das erste, was wir nach dem Lesen des Bildes getan haben, ist, es in ein ndarray zu konvertieren, um den image inversen Operator darauf anzuwenden. Nachdem Sie den Operator angewendet haben, konvertieren wir das ndarray einfach wieder in ein Bild und speichern es als result.tiff. Die folgende Abbildung zeigt das Ergebnis der Anwendung des inversen Bildes zum obigen Bild (das Originalbild befindet sich links und das Ergebnis der Anwendung des inversen Bildoperators ist rechts):

Beachten Sie, dass einige Funktionen des Bildes nach dem Anwenden des Operators klarer wurden. Schauen Sie sich zum Beispiel die Wolken und den Leuchtturm im rechten Bild an.

Machtgesetz-Transformation

Dieser Operator wird auch aufgerufen Gamma-Korrektur, ist ein weiterer Operator, mit dem wir ein Bild verbessern können. Sehen wir uns die Gleichung des Operators an. Am Pixel (i, j), Der Operator sieht folgendermaßen aus:

p (i, j) = kI (i, j) ^ gamma

Ich (ich, j) ist der Intensitätswert am Bildort (i, j); und k und Gamma sind positive Konstanten. Ich werde hier nicht auf mathematische Details eingehen, aber ich glaube, dass Sie ausführliche Erklärungen zu diesem Thema in Bildverarbeitungsbüchern finden können. Es ist jedoch wichtig, dies in den meisten Fällen zu beachten, k = 1, Wir werden also hauptsächlich den Wert von Gamma ändern. Die obige Gleichung kann somit reduziert werden auf:

p (i, j) = I (i, j) ^ gamma

Ich werde das verwenden OpenCV und NumPy Bibliotheken hier. Sie können mein Tutorial überprüfen. Einführung in NumPy, wenn Sie mehr über die Bibliothek erfahren möchten. Unser Testbild wird wieder boat.tiff sein (laden Sie es herunter).

Das Python-Skript zum Ausführen des Operators "Power Law Transformation" sieht folgendermaßen aus:

Import cv2 import numpy als np im = cv2.imread ('boat.tiff') im = im / 255.0 im_power_law_transformation = cv2.pow (im, 0.6) cv2.imshow ('Originalbild', im) cv2.imshow ('Power Law Transformation ', im_power_law_transformation) cv2.waitKey (0)

Beachten Sie, dass der von uns gewählte Gammawert ist 0,6. Die folgende Abbildung zeigt das Originalbild und das Ergebnis der Anwendung des Operators "Power Law Transformation" auf dieses Bild (das linke Bild zeigt das Originalbild und das rechte Bild zeigt das Ergebnis nach dem Anwenden des Operators "Power Law Transformation")..

Das Ergebnis oben war wann Gamma = 0,6. Mal sehen, was passiert, wenn wir den Gammawert erhöhen 1,5, zum Beispiel:

Beachten Sie, dass das Bild dunkler wird, wenn wir den Gammawert erhöhen, und umgekehrt.

Man könnte sich fragen, wie die Machtgesetztransformation genutzt werden könnte. In der Tat reagieren die verschiedenen Geräte, die für die Bilderfassung, das Drucken und die Anzeige verwendet werden, gemäß dem Operator für die Umwandlung des Leistungsgesetzes. Dies liegt an der Tatsache, dass das menschliche Gehirn eine Gammakorrektur verwendet, um ein Bild zu verarbeiten. Beispielsweise wird die Gammakorrektur als wichtig erachtet, wenn ein Bild korrekt auf einem Computermonitor oder auf einem Fernsehbildschirm angezeigt werden soll (der beste Bildkontrast wird in allen Bildern angezeigt).

Fazit

In diesem Lernprogramm haben Sie gelernt, wie Sie Bilder mit Python verbessern können. Sie haben gesehen, wie Sie Features mit dem Operator für inverse Bilder hervorheben, und wie die Umwandlung der Energieregel als entscheidender Operator für die korrekte Anzeige von Bildern auf Computermonitoren und Fernsehbildschirmen angesehen wird.

Zögern Sie nicht, zu sehen, was wir für den Verkauf und das Studium auf dem Envato-Markt zur Verfügung haben, und stellen Sie Ihre Fragen und stellen Sie Ihr wertvolles Feedback mithilfe des untenstehenden Feeds.