Einführung in OpenCV (Python) - (2)

Dies ist eine Fortsetzung des folgenden Artikels (ich möchte etwas machen, weil es nur Eingabeartikel gibt ...)

https://qiita.com/tom_S/items/b85aee14f34dcc856e54

Histogramm

Es ist möglich, die Verteilung der Pixelwerte auszudrücken, z. B. ob das Bild viel Rot oder viel Blau enthält.

Das Programm, das ein Histogramm der RGB-Werte als Grafik anzeigt, ist unten dargestellt.

import cv2
import matplotlib.pyplot as plt #Bibliothek für Bilddiagramme
%matplotlib inline #Bibliothek für Bilddiagramme

img = cv2.imread("Bilddateipfad hier")

color_list = ["blue", "green","red"]
for i,j in enumerate(color_list):
    hist = cv2.calcHist([img],[i],None,[256],[0,256]) # blue, green,Berechnen Sie in der Reihenfolge von Rot
    plt.plot(hist,color= j)

Ferner kann durch Gleichförmigkeit des Histogramms der helle Teil heller und der dunkle Teil dunkler gemacht werden. Vereinheitlichen Sie das Histogramm, indem Sie die Funktion EqualizeHist wie folgt aufrufen:

import cv2

img = cv2.imread("Bilddateipfad hier")
img_eq = cv2.equalizeHist(img) # img_Ein Bild mit einem uniformierten Histogramm ist in Gl

Gamma-Umwandlung

Grob gesagt wird die Methode zum Ändern der Helligkeit eines Bildes als Gammakonvertierung bezeichnet. Die Konvertierung wird unter Verwendung einer Gammatabelle (Nachschlagetabelle) wie der folgenden Formel durchgeführt. Wenn der Wert von r größer als 1 ist, wird er heller und wenn er kleiner als 1 ist, wird er dunkler.

y = 255* (x/255)^(1/r)

Der Quellcode wird unten angezeigt. (Die Erklärung der Nachschlagetabelle wird weggelassen)

import cv2
import numpy as np

gamma = 1.5 #R in der obigen Gleichung
img = cv2.imread("Bilddateipfad hier")
gamma_cvt = np.zeros((256,1), dtype= np.uint8)
for i in range(256):
    gamma_cvt[i][0] = 255 * (float(i)/255) ** (1.0/gamma)
    
img_gamma = cv2.LUT(img, gamma_cvt) #img_Das Bild nach der Gammakonvertierung wird in Gamma eingegeben

Ich denke, es ist schwer zu verstehen, welche Art von Wirkung es hat, deshalb werde ich einen Link zu einer Site einfügen, die unten hilfreich zu sein scheint. http://peaceandhilightandpython.hatenablog.com/entry/2016/02/05/004445

Eine gute Bekehrung

Die Affinitätskonvertierung ist eine Kombination aus Bewegungen, die ein Bild durch Kombination von paralleler Bewegung und Rotation bewegen, und Konvertierung (Scherverformung), die ein Rechteck in ein paralleles Viereck verwandelt. Die Affinitätskonvertierung wird durch Ausführen einer Matrixberechnung durchgeführt.

Da es notwendig ist, die Matrizen für die parallele Bewegung zu summieren, fügen Sie der Matrix homogene Koordinaten hinzu, um die lineare Transformation zu reduzieren, und erstellen Sie eine Transformationsmatrix, um einen Ausdruck zwischen einseitigen Begriffen zu erstellen. Zeigt den Quellcode für parallele Bewegung und Drehung an

Parallelbewegung

import cv2
import numpy as np

img = cv2.imread("Bilddateipfad hier")
h,w = img.shape[:2]
dx,dy = 30,30

afn_mat = np.float32([[1,0,dx],[0,1,dy]]) #Nur parallele Bewegung. Vertikal und horizontal um 30 verschieben
img_afn = cv2.warpAffine(img, afn_mat,(w,h)) # img_Das Bild nach paralleler Bewegung wird in afn eingegeben

Drehung

import cv2
import numpy as np

img = cv2.imread("Bilddateipfad hier")
h,w = img.shape[:2]

rot_mat = cv2.getRotationMatrix2D((w/2,h/2),40,1) # (Koordinaten des rotierenden Zentrums,Drehwinkel,Bildmaßstab(1 ist gleich groß))geben
img_afn2 = cv2.warpAffine(img, rot_mat,(w,h)) # img_Das Bild nach der Drehung ist in afn enthalten

Falten

Das Aktualisieren Ihres eigenen Pixelwerts unter Verwendung von Umgebungsinformationen wird als Faltung bezeichnet.

Wie man faltet

  1. Bereiten Sie einen Filter vor

  2. Führen Sie "(Pixelwert) x (Filter)" um das interessierende Pixel herum aus und fügen Sie es hinzu (dies wird als Falten bezeichnet).

  3. Auf alle Pixel legen und falten

Filter, die Faltung verwenden

Glättungsfilter

Der Pixelwert wird aus den Umgebungsinformationen berechnet und Rauschen wird entfernt. Der Quellcode wird unten angezeigt

import cv2 
import numpy as np

kernel = np.ones((3,3)) /9.0 #Filter zum Falten verwendet

img = cv2.imread("Bilddateipfad hier", 0)
img_kel = cv2.filter2D(img, -1, kernel) #Streit "-1 "ist das Originalbild(img)Mittel zur Rückkehr.Falten (Glätten)

Sobel Filter

Vertikale Kanten können durch Differenzieren erkannt werden. Ein Beispiel für einen Quellcode ist unten dargestellt.

import cv2 
import numpy as np

kernel2 = np.zeros((3,3))
kernel2[0,0] = 1
kernel2[1,0] = 2
kernel2[2,0] = 1
kernel2[0,2] = -1
kernel2[1,2] = -2
kernel2[2,2] = -1

img = cv2.imread("Bilddateipfad hier", 0)
img_ke2 = cv2.filter2D(img, -1,kernel2) #Sobel Filter

Glättungsfilter

--Lineare Transformation

Ein Filter, der die gesamte Oberfläche gleichmäßig glättet und verwischt. Der Quellcode wird unten angezeigt.

import cv2 

img = cv2.imread("Bilddateipfad hier")

img_blur = cv2.blur(img, (3,3)) #Glättungsfilter
img_ga = cv2.GaussianBlur(img,(9,9), 2) #2 ist der Verteilungswert. Je größer dieser Wert ist, desto unschärfer wird er(Gaushan)
img_me = cv2.medianBlur(img, 5) #Schreiben Sie mit dem häufigsten Wert um(Verschwommen)Medianfilter

Es gibt einen bilateralen Filter für die nichtlineare Konvertierung. Dies dient dazu, den Teil zu verlassen, in dem die Helligkeitsänderung drastisch ist, und den Teil zu glätten, in dem die Helligkeitsänderung allmählich erfolgt. Der Quellcode wird unten angezeigt.

import cv2 

img = cv2.imread("Bilddateipfad hier")

img_bi = cv2.bilateralFilter(img,20,30,30)

Morphologie-Arithmetik

Eine Operation, die aus Expansion und Kontraktion besteht. Sie wird verwendet, um Bilder durch Kontraktion zu trennen und durch Expansion zu integrieren. Darüber hinaus kann Lärm durch Zusammenziehen und Ausdehnen beseitigt werden. Der Quellcode wird unten angezeigt.

import cv2

img = cv2.imread("Bilddateipfad hier")
ret, img_th = cv2.threshold(img, 110, 255, cv2.THRESH_BINARY) #Binarisierung

kernel = np.ones((3,3),dtype = np.uint8) #Wenn es Weiß in der Nähe von 8 gibt, wird es weiß sein, wenn es viel Schwarz gibt, wird es schwarz sein
img_d = cv2.dilate(img_th, kernel)
img_e = cv2.erode(img_th,kernel)

img_c = cv2.morphologyEx(img_th,cv2.MORPH_CLOSE, kernel) # img_Das Bild nach der Berechnung wird in c eingegeben
# MORPH_CLOSE:Führt nach der Erweiterung einen Vertragsprozess durch
# (MORPH_Durch Angabe von OPEN ist es auch möglich, nach der Kontraktion zu expandieren.)

Merkmalsextraktion

――Eigenschaften sind Teile mit vielen Informationen. Es gibt die folgenden drei Funktionen. Für die Merkmalsextraktion finden Sie im Bild einen Eigenvektor mit einem großen Eigenwert.

--Flach: Das Bild enthält keine Richtung. Der Eigenvektor ist nicht vorgespannt und der Eigenwert ist klein (weniger Merkmale)

--Edge: Es gibt einen Eigenvektor mit einem größeren Eigenwert im Bild (charakteristischer als flach)

Feature-Extraktor

Extraktor Erläuterung
Harris Wenn sich die Skala ändert, sinkt die Genauigkeit. Merkmale werden durch Eigenwerte und Eigenvektoren extrahiert
SIFT Die Feature-Menge beträgt 128 Dimensionen. Wegen Patenterwerb nicht für den kommerziellen Gebrauch verfügbar
SURF Beschleunigen Sie SIFT. Wegen Patenterwerb nicht für den kommerziellen Gebrauch verfügbar
ORB Binarisierte Merkmalsmenge. Einfach und zu empfehlen
KAZE Verwendet einen nichtlinearen Filter. Einfach und zu empfehlen
AKAZE Eine schnellere Version von KAZE. Einfach und zu empfehlen

So zeigen Sie den Quellcode für jeden Extraktor an.

import cv2
import numpy as np
import copy

img = cv2.imread("Bilddateipfad hier")
img_g = cv2.imread("Bilddateipfad hier",0)

# Harris
img_harris = copy.deepcopy(img)
img_dst = cv2.cornerHarris(img_g, 2,3,0.04)
#2 ist die Blockgröße. Wie viel Reichweite sollte erkannt werden? Wenn Sie es groß machen, erhöht sich die Extraktionsmenge

# KAZE
img_kaze = copy.deepcopy(img)
kaze = cv2.KAZE_create() #Feature-Extraktor erstellen(KAZE)
kp1 = kaze.detect(img,None)
img_kaze = cv2.drawKeypoints(img_kaze, kp1, None) #Das im Feature-Teil markierte Bild ist img_Kaze betreten

# AKAZE
img_kaze = copy.deepcopy(img)
kaze = cv2.AKAZE_create() #Feature-Extraktor erstellen(AKAZE)
kp1 = kaze.detect(img,None)
img_kaze = cv2.drawKeypoints(img_kaze, kp1, None) #Das im Feature-Teil markierte Bild ist img_Kaze betreten

# ORB
img_orb = copy.deepcopy(img)
orb = cv2.ORB_create() #Feature-Extraktor erstellen(ORB)
kp2 = orb.detect(img_orb)
img_orb = cv2.drawKeypoints(img_orb, kp2, None) #Das im Feature-Teil markierte Bild ist img_Kugel eingeben

Recommended Posts

Einführung in OpenCV (Python) - (2)
Einführung in die Bildanalyse opencv python
Einführung in die Python-Sprache
Einführung in Python Django (2) Win
Einführung in die serielle Kommunikation [Python]
[Einführung in Python] <Liste> [Bearbeiten: 22.02.2020]
Einführung in Python (Python-Version APG4b)
Eine Einführung in die Python-Programmierung
Einführung in Python For, While
[Einführung in die Udemy Python3 + -Anwendung] 58. Lambda
Einführung in die Python Numerical Calculation Library NumPy
Trainieren! !! Einführung in Python Type (Type Hints)
[Einführung in Python3 Tag 1] Programmierung und Python
[Einführung in Python] <numpy ndarray> [edit: 2020/02/22]
[Einführung in die Udemy Python3 + -Anwendung] 57. Decorator
Einführung in Python Hands On Teil 1
[Einführung in Python3 Tag 13] Kapitel 7 Zeichenfolgen (7.1-7.1.1.1)
[Einführung in Python] So analysieren Sie JSON
[Einführung in die Udemy Python3 + -Anwendung] 56. Abschluss
[Einführung in Python3 Tag 14] Kapitel 7 Zeichenfolgen (7.1.1.1 bis 7.1.1.4)
Einführung in Protobuf-c (C-Sprache ⇔ Python)
[Einführung in die Udemy Python3 + -Anwendung] 59. Generator
[Einführung in Python3 Tag 15] Kapitel 7 Zeichenfolgen (7.1.2-7.1.2.2)
[Einführung in Python] Verwenden wir Pandas
[Einführung in Python] Verwenden wir Pandas
[Einführung in die Udemy Python3 + -Anwendung] Zusammenfassung
[Einführung in Python] Verwenden wir Pandas
Erste Schritte mit Python für Nicht-Ingenieure
Einführung in Python Django (2) Mac Edition
[AWS SAM] Einführung in die Python-Version
[Einführung in Python3 Tag 21] Kapitel 10 System (10.1 bis 10.5)
[Python Tutorial] Eine einfache Einführung in Python
Einführung in MQTT (Einführung)
Einführung in Scrapy (1)
Einführung in Scrapy (3)
Auf Python 2.7.9 aktualisiert
Einführung in Tkinter 1: Einführung
Python2.7 + CentOS7 + OpenCV3
Einführung in PyQt
[Linux] Einführung in Linux
Einführung in Scrapy (4)
OpenCV-Beispiele (Python)
Einführung in discord.py (2)
[Hinweis] openCV + Python
"Backport" zu Python 2
Einführung von Python
[Einführung in die Udemy Python3 + -Anwendung] 18. Listenmethode
[Einführung in die Udemy Python3 + -Anwendung] 63. Notation zur Einbeziehung des Generators
[Einführung in die Udemy Python3 + -Anwendung] 28. Kollektiver Typ
[Einführung in die Udemy Python3 + -Anwendung] 25. Wörterbuchmethode
[Einführung in die Udemy Python3 + -Anwendung] 33. if-Anweisung
Einführung in die diskrete Ereignissimulation mit Python # 1
[Einführung in die Udemy Python3 + -Anwendung] 13. Zeichenmethode
[Einführung in Python3, Tag 17] Kapitel 8 Datenziele (8.1-8.2.5)
[Einführung in die Udemy Python3 + -Anwendung] 55. In-Function-Funktionen
[Einführung in die Udemy Python3 + -Anwendung] 48. Funktionsdefinition
[Einführung in Python3, Tag 17] Kapitel 8 Datenziele (8.3-8.3.6.1)
Python Bit Arithmetic Super Einführung
[Einführung in die Udemy Python3 + -Anwendung] 10. Numerischer Wert