[PYTHON] 100 Klopfen bei der Bildverarbeitung !! (001 - 010) Vorsichtig und vorsichtig

1. Zuallererst

Üben Sie dies, um die technischen Möglichkeiten der Bildvorverarbeitung zu verbessern 100 Klopfen für die Bildverarbeitung !! Ich werde es mit Colaboratory machen, damit es einfach ist, loszulegen. Wir werden daran arbeiten, das Ziel in zwei Wochen zu erreichen. Ich werde es sorgfältig erklären. Bitte stellen Sie eine Frage!

2. Vorbereitung

Eingeführte Bibliotheken usw. wie folgt.

python


#Bibliothek importieren
from google.colab import drive
import numpy as np
import matplotlib.pyplot as plt
import cv2
from google.colab.patches import cv2_imshow

#Laden von Bildern
img = cv2.imread('Bildpfad/imori.jpg')
img_noise = cv2.imread('Bildpfad/imori_noise.jpg')
#Zur Bildspeicherung
OUT_DIR = 'Zielpfad ausgeben/OUTPUT/'

3. Erklärung

Q.1. Kanalwechsel

Laden Sie das Bild und ersetzen Sie RGB in BGR-Reihenfolge. Mit dem folgenden Code können Sie die rote Komponente des Bildes extrahieren. Beachten Sie, dass in der Funktion cv2.imread () die Kanäle in der Reihenfolge BGR liegen! Dadurch wird nur die rote Komponente von imori.jpg in die Variable rot eingefügt.

A1


#OpenCV-Funktion cvtColor()Konvertieren Sie BGR und RGB mit
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#Speichern Sie das Ergebnis
cv2.imwrite(OUT_DIR + 'ans1_a.jpg', img1)
#Bild anzeigen
cv2_imshow(img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

img1.png

Referenz: cvtColor, das BGR und RGB mit Python, OpenCV konvertiert

Q.2. Graustufen

Machen Sie das Bild grau. Graustufen sind eine Art Ausdrucksmethode für die Bildhelligkeit und werden nach der folgenden Formel berechnet. Y = 0.2126 R + 0.7152 G + 0.0722 B

A2


#OpenCV-Funktion cv2.cvtColor(), cv2.COLOR_Konvertieren Sie mit BGR2GRAY
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Speichern Sie das Ergebnis
cv2.imwrite(OUT_DIR + 'ans2_.jpg', img2)
#Bild anzeigen
cv2_imshow(img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

img2.png

Referenz: Farbbild mit Python, OpenCV, NumPy in Schwarzweiß (Graustufen) konvertieren

Q.3. Binarisierung

Binarisieren Sie das Bild. Die Binarisierung ist eine Methode zum Ausdrücken eines Bildes mit zwei Werten, Schwarz und Weiß. Hier wird der Schwellenwert in der Graustufe auf 128 gesetzt und durch die folgende Gleichung binärisiert.

A3


#Bild(Graustufen)Kopie von
img3 = img2.copy()

#Schwellenwert einstellen
threshold = 128

#Binarisierung(Die Anzahl der Pixel, die den Schwellenwert 128 überschreiten, wird auf 255 eingestellt.)
ret, img3 = cv2.threshold(img3, threshold, 255, cv2.THRESH_BINARY)

#Speichern Sie das Ergebnis
cv2.imwrite(OUT_DIR + 'ans3_.jpg', img3)
#Bild anzeigen
cv2_imshow(img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

img3.png

Referenz: Variation des OpenCV-Bildes Referenz: Bildschwellenwertverarbeitung

Q.4. Binarisierung von Otsu

Implementieren Sie die Binärisierung von Otsu. Die Binärisierung von Otsu wird als Diskriminanzanalyseverfahren bezeichnet, bei dem die Trennungsschwelle bei der Binärisierung automatisch bestimmt wird. Dies wird aus dem Verhältnis der Verteilung innerhalb der Klasse zur Verteilung zwischen den Klassen berechnet.

A4


#In OpenCV implementiert
#Bild(Graustufen)Kopie von
gray = img2.copy()
#Otsus Binarisierungsprozess
ret, image4 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)

#Speichern Sie das Ergebnis
cv2.imwrite(OUT_DIR + 'ans4.jpg', img4)
#Bild anzeigen
cv2_imshow(img4)
cv2.waitKey(0)
cv2.destroyAllWindows()

img4.png

Referenz: [Python / OpenCV] Binarisierungsprozess unter Verwendung der Otsu-Methode

Q.5. HSV-Umwandlung

Implementieren Sie die HSV-Konvertierung, um den Farbton H zu invertieren. Die HSV-Konvertierung ist eine Methode zum Ausdrücken von Farben mit Farbton (Farbton), Sättigung (Sättigung) und Wert (Helligkeit). Farbton ... Drückt den Farbton von 0 bis 360 Grad aus und gibt die Art der Farbe an, z. B. Rot oder Blau. (0 <= H <360) Der Farbton entspricht den folgenden Farben. Rot Gelb Grün Hellblau Blau Lila Rot 0 60 120 180 240 300 360 Sättigung ... Lebendigkeit der Farbe. Wenn die Sättigung niedrig ist, macht sich die graue Farbe bemerkbar und die Farbe wird matt. (0 <= S <1) Wert ... Farbhelligkeit. Je höher der Wert, desto näher an Weiß und je niedriger der Wert, desto näher an Schwarz. (0 <= V <1)

A5


#Kopieren Sie das Bild
img5 = img.copy()
# RGB ->Zum HSV konvertieren
hsv = cv2.cvtColor(img5, cv2.COLOR_BGR2HSV)
#Fügen Sie 180 zu Farbton hinzu
hsv[..., 0] = (hsv[..., 0] + 180) % 360
# HSV ->In RGB konvertieren
img5 = cv2.cvtColor(hsv, cv2.COLOR_HSV2RGB)
#Speichern Sie das Ergebnis
cv2.imwrite(OUT_DIR + 'ans5.jpg', img5)
#Bild anzeigen
cv2_imshow(img5)
cv2.waitKey(0)
cv2.destroyAllWindows()

img5.png

Aus irgendeinem Grund unterscheidet es sich geringfügig vom Antwortbild. Bitte lassen Sie mich wissen, wenn Sie einen Fehler machen

Referenz: [Python / OpenCV] Konvertieren von RGB in HSV (cv2.cvtColor)](https://algorithm.joho.info/programming/python/opencv-rgb-to-hsv-color-space/)

Q.6. Farbreduktionsverarbeitung

Reduzieren Sie hier die Bildwerte von 256 ^ 3 auf 4 ^ 3, dh R, G, B in {32, 96, 160, 224}. Dies ist eine Quantisierungsoperation. Jeder Wert ist wie folgt definiert.

A6


def decrease_color(img):
    """
    R,G,Setzen Sie B auf 256 und setzen Sie einen Wert auf 4.
    [0, 64), [64, 128), [128, 192), (192, 256)In 4 gleiche Teile teilen *[]: Geschlossener Abschnitt(Oberhalb und unterhalb), (): Abschnitt öffnen(Groß oder klein)
    [0, 64)->32,  [64, 128)->96,  [128, 192)->160,  (192, 256) ->Konvertieren Sie jeden Bereich in 2224

    parameters
    -------------------------
    param: numpy.Bild im ndarray-Format

    returns
    -------------------------
    numpy.ndarray-Format Konvertieren Sie wie rechts gezeigt[132  80  67] >>> [160  96  96]
    """
    #Kopiere das Bild
    out = img.copy()
    print(out)
    # 256/4 =Da es 64 ist, wird es durch 64 geteilt+32 durch 32, 96, 160,In 224 konvertieren
    out = out // 64 * 64 + 32
    return out

img6 = img.copy()

img6 = decrease_color(img6)
#Speichern Sie das Ergebnis
cv2.imwrite(OUT_DIR + 'ans6.jpg', img6)
#Bild anzeigen
cv2_imshow(img6)
cv2.waitKey(0)
cv2.destroyAllWindows()

img6.png

Referenz: Irgendwie Blog

Q.7. Durchschnittliches Pooling

Hier wird das Bild in Gitter unterteilt (in bestimmte Bereiche fester Länge unterteilt), und die Werte im Bereich werden mit dem Durchschnittswert im Bereich (Zelle) gefüllt. Der Vorgang, das Gitter auf diese Weise zu teilen und den repräsentativen Wert in dem Bereich zu finden, wird als Pooling bezeichnet. Diese Pooling-Operationen spielen eine wichtige Rolle in CNN (Convolutional Neural Network).

A7


def average_pooling(img, G=8):
    """
Durchschnittliches Pooling

    parameters
    -------------------------
    param1: numpy.Bild im ndarray-Format
    param2:Gitteraufteilung in 8x8

    returns
    -------------------------
Durchschnittliche gepoolte Anzahl.Bild im ndarray-Format
    """
    #Kopiere das Bild
    out = img.copy()
    # H(Bildhöhe), W(Bild breite), C(Farbe)Erhalten
    H, W, C = img.shape
    #Netzaufteilung
    Nh = int(H / G)
    Nw = int(W / G)

    #Durchschnittliches Pooling für jeden 8-teiligen Bereich
    for y in range(Nh):
        for x in range(Nw):
            for c in range(C):
                out[G*y:G*(y+1), G*x:G*(x+1), c] = np.mean(out[G*y:G*(y+1), G*x:G*(x+1), c]).astype(np.int)
    
    return out

#Durchschnittliches Pooling
img7 = average_pooling(img)
#Speichern Sie das Ergebnis
cv2.imwrite(OUT_DIR + 'ans7.jpg', img7)
#Bild anzeigen
cv2_imshow(img7)
cv2.waitKey(0)
cv2.destroyAllWindows()

img7.png

Q.8. Max Pooling

Poolen Sie hier mit dem Maximalwert anstelle des Durchschnittswerts.

A8


def max_pooling(img, G=8):
    """
Maximales Pooling

    parameters
    -------------------------
    param1: numpy.Bild im ndarray-Format
    param2:Gitteraufteilung in 8x8

    returns
    -------------------------
Maximale gepoolte Anzahl.Bild im ndarray-Format
    """
    #Kopiere das Bild
    out = img.copy()
    # H(Bildhöhe), W(Bild breite), C(Farbe)Erhalten
    H, W, C = img.shape
    #Netzaufteilung
    Nh = int(H / G)
    Nw = int(W / G)

    #Durchschnittliches Pooling für jeden 8-teiligen Bereich
    for y in range(Nh):
        for x in range(Nw):
            for c in range(C):
                out[G*y:G*(y+1), G*x:G*(x+1), c] = np.max(out[G*y:G*(y+1), G*x:G*(x+1), c]).astype(np.int)
    
    return out

#Maximales Pooling
img8 = average_pooling(img)
#Speichern Sie das Ergebnis
cv2.imwrite(OUT_DIR + 'ans8.jpg', img8)
#Bild anzeigen
cv2_imshow(img8)
cv2.waitKey(0)
cv2.destroyAllWindows()

img8.png

Q.9. Gaußscher Filter

Implementieren Sie einen Gaußschen Filter (3x3, Standardabweichung 1.3), um Rauschen in imori_noise.jpg zu entfernen. Der Gaußsche Filter ist eine Art Filter, der das Bild glättet (glättet) und auch zur Rauschentfernung verwendet wird. Andere Rauschentfernungsmethoden umfassen einen Medianfilter (Q.10), einen Glättungsfilter (Q.11) und einen LoG-Filter (Q.19). Das Gaußsche Filter glättet die peripheren Pixel des interessierenden Pixels durch Gewichtung mit einer Gaußschen Verteilung und wird durch die folgende Gleichung definiert. Solche Gewichte werden als Kernel oder Filter bezeichnet. Da die Bildränder jedoch nicht so gefiltert werden können, wie sie sind, wird der Teil mit unzureichenden Pixeln mit 0 gefüllt. Dies wird als 0-Auffüllung bezeichnet. Und die Gewichte sind normalisiert. (Summe g = 1)

A9


#Von OpenCV verarbeitet
# cv2.GaussianBlur(src, ksize, sigmaX)
# src:Bild eingeben, ksize:Kernelgröße, sigmaX:Gaußsches Verteilungssigma_x
img9 = cv2.GaussianBlur(img_noise, ksize=(3, 3), sigmaX=1.3)

#Speichern Sie das Ergebnis
cv2.imwrite(OUT_DIR + 'ans9.jpg', img9)
#Bild anzeigen
cv2_imshow(img9)
cv2.waitKey(0)
cv2.destroyAllWindows()

img9.png

Referenz: [Python / OpenCV] Verwischen / Glätten mit Gauß-Filter

Q.10 Medianfilter

Implementieren Sie einen Medianfilter (3x3), um Rauschen aus imori_noise.jpg zu entfernen. Ein Medianfilter ist eine Art Filter, der ein Bild glättet. Dies ist ein Filter, der den Medianwert (Medianwert) im 3x3-Bereich des interessierenden Pixels ausgibt. Dies ist auch keine Polsterung.

A10


#Von OpenCV verarbeitet
"""
cv2.medianBlur(src, ksize)
src Eingabebild
Kernelgröße des Kernelfilters (nahe 8, wenn 3)
"""
#Medianfilter
img10 = cv2.medianBlur(img_noise, ksize=3)
#Speichern Sie das Ergebnis
cv2.imwrite(OUT_DIR + 'ans10.jpg', img10)
#Bild anzeigen
cv2_imshow(img10)
cv2.waitKey(0)
cv2.destroyAllWindows()

img10.png

Referenz: [Python / OpenCV] Entfernen von Unschärfe / Glätten / Rauschen mit Medianfilter

Impressionen

Die Vorverarbeitung ist beim maschinellen Lernen wichtig. Wenn Sie die Methode nicht kennen, werden Sie keine Ideen haben, daher lohnt sich die Mühe. Das Klopfformat erleichtert die Bearbeitung

Recommended Posts

100 Klopfen bei der Bildverarbeitung !! (001 - 010) Vorsichtig und vorsichtig
Bildverarbeitung 100 Schläge ①
100 Schläge bei der Bildverarbeitung !! (011-020) Frühes Spiel
Bildausdehnung und Kontraktionsverarbeitung
Die Bildverarbeitung mit Python 100 klopft an die Binärisierung Nr. 3
Bildverarbeitung 100 Klopfen Q9, Q10 (Filter) Beschleunigung
100 Bildverarbeitung mit Python Knock # 2 Graustufen
100 Sprachverarbeitungsklopfen 03 ~ 05
[Bildverarbeitung] Posterisierung
100 Sprachverarbeitungsklopfen (2020): 40
100 Sprachverarbeitungsklopfen (2020): 32
100 Sprachverarbeitungsklopfen (2020): 35
Python-Bildverarbeitung
100 Sprachverarbeitungsklopfen (2020): 39
100 Sprachverarbeitungsklopfen (2020): 22
100 Sprachverarbeitungsklopfen (2020): 26
100 Sprachverarbeitungsklopfen (2020): 34
100 Bildverarbeitung mit Python Knock # 8 Max Pooling
100 Sprachverarbeitungsklopfen (2020): 42
100 Sprachverarbeitungsklopfen (2020): 29
100 Sprachverarbeitungsklopfen 06 ~ 09
100 Sprachverarbeitungsklopfen (2020): 43
100 Sprachverarbeitungsklopfen (2020): 24
100 Sprachverarbeitungsklopfen (2020): 45
100 Sprachverarbeitungsklopfen (2020): 10-19
100 Sprachverarbeitungsklopfen (2020): 30
100 Sprachverarbeitungsklopfen (2020): 00-09
100 Sprachverarbeitungsklopfen (2020): 31
100 Sprachverarbeitungsklopfen (2020): 48
100 Sprachverarbeitungsklopfen (2020): 44
100 Sprachverarbeitungsklopfen (2020): 41
100 Sprachverarbeitungsklopfen (2020): 37
Die Bildverarbeitung mit Python 100 führt zu einem durchschnittlichen Pooling von # 7
100 Sprachverarbeitungsklopfen (2020): 25
100 Sprachverarbeitungsklopfen (2020): 23
100 Sprachverarbeitungsklopfen (2020): 33
100 Sprachverarbeitungsklopfen (2020): 20
100 Sprachverarbeitungsklopfen (2020): 27
100 Sprachverarbeitungsklopfen (2020): 46
100 Sprachverarbeitungsklopfen (2020): 21
Bildverarbeitung mit Python 100 Knock # 9 Gauß-Filter
100 Sprachverarbeitungsklopfen (2020): 36
100 Amateur-Sprachverarbeitungsklopfen: 71
100 Amateur-Sprachverarbeitungsklopfen: 56
100 Amateur-Sprachverarbeitungsklopfen: 24
100 Amateur-Sprachverarbeitungsklopfen: 50
100 Amateur-Sprachverarbeitungsklopfen: 59
100 Amateur-Sprachverarbeitungsklopfen: 70
Bildverarbeitung mit MyHDL
100 Amateur-Sprachverarbeitungsklopfen: 62
100 Amateur-Sprachverarbeitungsklopfen: 60
100 Amateur-Sprachverarbeitungsklopfen: 92
100 Amateur-Sprachverarbeitungsklopfen: 30
100 Amateur-Sprachverarbeitungsklopfen: 06
100 Amateur-Sprachverarbeitungsklopfen: 84
100 Amateur-Sprachverarbeitungsklopfen: 81
100 Amateur-Sprachverarbeitungsklopfen: 33
100 Amateur-Sprachverarbeitungsklopfen: 46
100 Amateur-Sprachverarbeitungsklopfen: 88
100 Amateur-Sprachverarbeitungsklopfen: 89