opencv-python Einführung in die Bildverarbeitung

Ich werde schreiben, dass ich die Vorverarbeitungsmethode von Bildern für maschinelles Lernen untersucht habe. Der Inhalt ist zur Hälfte fertig, aber ich denke, ich werde in Zukunft weitere hinzufügen.

Testumgebung

Windows10 python 3.6 opencv-python 4.1.2.30

Schwellenwertverarbeitung: cv.Threshold (src, Schwellwert, maxValue, Schwellwerttyp)

opencv Dokumentation http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html

Binarisieren Sie durch Angabe eines Schwellenwerts

Ich werde ein geeignetes Abstufungsbild erstellen und es binärisieren image.png

# make gray scale picture
im_gray = np.array([np.arange(0, 256, 2) for k in range(100)])
im_gray = im_gray.astype('uint8')
print(im_gray.shape)

# apply threshold
ret, thresh1 = cv2.threshold(im_gray,127,255,cv2.THRESH_BINARY)

# show picture
plt.figure(figsize=(7, 6))

ax = plt.subplot(1, 2, 1)
ax.imshow(im_gray, 'gray')
ax.set_xticks([])
ax.set_yticks([])
ax.set_title('ORIGINAL')

ax = plt.subplot(1, 2, 2)
ax.imshow(thresh1, 'gray')
ax.set_xticks([])
ax.set_yticks([])
ax.set_title('BINARY')

plt.show()

Der Schwellenwert wird automatisch festgelegt und binärisiert

Binar nach Otsus Methode image.png

# make gray scale picture
im_gray = np.array([np.arange(0, 256, 2) for k in range(100)])
im_gray = im_gray.astype('uint8')
print(im_gray.shape)

# global thresholding
ret1,th1 = cv2.threshold(im_gray,127,255,cv2.THRESH_BINARY)

# Otsu's thresholding
ret2,th2 = cv2.threshold(im_gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)


# show picture
plt.figure(figsize=(7, 6))

ax = plt.subplot(1, 2, 1)
ax.imshow(im_gray, 'gray')
ax.set_xticks([])
ax.set_yticks([])
ax.set_title('ORIGINAL')

ax = plt.subplot(1, 2, 2)
ax.imshow(thresh1, 'gray')
ax.set_xticks([])
ax.set_yticks([])
ax.set_title('OTSU')

plt.show()

Binarisierung mit dynamischem Schwellenwert: adaptiveThreshold (src, maxValue, adaptiveMethod, schwellwerttyp, blockSize, C [, dst])

Es wird verwendet, wenn eine Helligkeitsabstufung vorliegt, z. B. bei einem fotografischen Bild, und das gesamte Bild nicht mit einem Schwellenwert binärisiert werden kann. image.png http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('../input/dave.jpg',0)
img = cv2.medianBlur(img,5)

ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
            cv2.THRESH_BINARY,11,2)
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
            cv2.THRESH_BINARY,11,2)

titles = ['Original Image', 'Global Thresholding (v = 127)',
            'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]

plt.figure(figsize=(6.5, 6))
for i in range(4):
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

Andere Schwellenwertverarbeitung

Es gibt verschiedene andere Schwellenwerttypen als die häufig verwendete Binarisierung. image.png

# make gray scale picture
im_gray = np.array([np.arange(0, 256, 2) for k in range(100)])
im_gray = im_gray.astype('uint8')
print(im_gray.shape)

# apply threshold
ret,thresh1 = cv2.threshold(im_gray,127,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(im_gray,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(im_gray,127,255,cv2.THRESH_TRUNC)
ret,thresh4 = cv2.threshold(im_gray,127,255,cv2.THRESH_TOZERO)
ret,thresh5 = cv2.threshold(im_gray,127,255,cv2.THRESH_TOZERO_INV)

# show result
titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [im_gray, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
    plt.subplot(2,3,i+1)
    plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

Bild laden: cv2.imread ()

Lesen Sie von hier aus eine entsprechende Bilddatei und verwenden Sie sie. Sie können das Bild als numpy.array von cv2.imread () lesen. Ich verwende cv2.imshow () oder plt.imshow (), um das Bild anzuzeigen, aber cv2.imshow () scheint nicht mit jupyter notebook zu funktionieren, daher werde ich es mit plt.imshow () anzeigen. Während opencv den Wert traditionell in BGR liest, zeigt plt.imshow () ihn als RGB an. Nach dem Austausch von R und B mit cv2.cvtColor (src, cv2.COLOR_BGR2RGB) Ich werde es anzeigen.

python


import cv2
import matplotlib.pyplot as plt

im = cv2.imread('../input/opencv.png')

plt.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB))
plt.xticks([])
plt.yticks([])
plt.show()

Dieses Mal werde ich es mit diesem Bild machen

Bild verwischen: cv2.GaussianBlur (src, (Größe, Größe), Sigma)

opencv Dokumentation http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_filtering/py_filtering.html

Ein Filter, der das Bild verwischt. Größe ist die vertikale und horizontale Größe, und Sigma ist die vertikale und horizontale Standardabweichung. Sie können Sigma auch vertikal und horizontal angeben. Wenn Sie dies jedoch weglassen, wird dieselbe Standardabweichung sowohl vertikal als auch horizontal verwendet. Durch Erhöhen von Größe und Sigma wird der Grad der Unschärfe erhöht.

python


plt.figure(figsize=(8, 10.4))

for k, size in enumerate([3, 9, 27]):
    for k2, sigma in enumerate([0, 10, 40]):
        blur = cv2.GaussianBlur(im, (size, size), sigma)
        ax = plt.subplot(3, 3, k2*3+k+1)
        ax.imshow(cv2.cvtColor(blur, cv2.COLOR_BGR2RGB))
        ax.set_xticks([])
        ax.set_yticks([])
        ax.set_title('blur size: %d\nsigma: %d' % (size, sigma))
plt.show()

Alphasynthese: addWeighted (src1, alpha, src2, beta, gamma)

opencv Dokumentation https://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html

Sie können ein gemischtes Bild wie dieses erstellen. Sie können auch einen Wert größer als 1 in Alpha und Beta eingeben, der Wert wird jedoch für Pixel mit einem großen Wert abgeschüttelt, sodass er wie das Bild am rechten Ende etwas seltsam gemischt wird.

python


im2 = cv2.imread('../input/black_white.png')[:,:,::-1]
plt.imshow(cv2.cvtColor(im2, cv2.COLOR_BGR2RGB))

python


plt.figure(figsize=(15, 20))
for k, alpha in enumerate([0, 0.25, 0.5, 0.75, 1]):
    for k2, gamma in enumerate([0, 0.5, 1, 2, 4]):
        beta = 1 - alpha
        im3 = cv2.addWeighted(im, alpha, im2, beta, gamma)

        ax = plt.subplot(5, 5, 5*k2+k+1)
        ax.imshow(cv2.cvtColor(im3, cv2.COLOR_BGR2RGB))
        ax.set_title('alpha: %1.2f\nbeta: %1.2f\ngamma: %1.2f' % (alpha, beta, gamma))
        ax.set_xticks([])
        ax.set_yticks([])
plt.show()

Konturverbesserung durch Unschärfe und Alpha-Compositing

Sie können den Umriss hervorheben, indem Sie das unscharfe Bild aus dem Originalbild zeichnen.

python


blur = cv2.GaussianBlur(im, (9, 9), 27)
im3 = cv2.addWeighted(im, 1.5, blur, -0.5, 1)

plt.figure(figsize=(10, 5))

ax = plt.subplot(1, 3, 1)
ax.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB))
ax.set_title('base image')
ax.set_xticks([])
ax.set_yticks([])

ax = plt.subplot(1, 3, 2)
ax.imshow(cv2.cvtColor(blur, cv2.COLOR_BGR2RGB))
ax.set_title('gaussianBlur')
ax.set_xticks([])
ax.set_yticks([])

ax = plt.subplot(1, 3, 3)
ax.imshow(cv2.cvtColor(im3, cv2.COLOR_BGR2RGB))
ax.set_title('addWeighted')
ax.set_xticks([])
ax.set_yticks([])

plt.show()

Wenn Sie das Originalbild mit Alpha = 1,5 und das unscharfe Bild mit Beta = -0,5 mischen, erhalten Sie ein Bild mit verbesserten Konturen.

Filterung: cv2.filter2D (src, Kernel)

Faltfilterfunktion. Es scheint, dass verschiedene Filterungen implementiert werden können, indem der Wert des Arrays geändert wird. Das oben beschriebene gaussianBlur () kann auch mit dieser Funktion implementiert werden.

Parallelbewegung

Wenn Sie den Kernel auf [1] setzen, erhalten Sie dasselbe Bild wie das Originalbild. Wenn ein Teil eines relativ großen Arrays auf 1 und alle anderen auf 0 gesetzt sind, kann es wie unten gezeigt parallel verschoben werden.

python


size = 21
kernel = np.zeros(size**2).reshape(size, size)
kernel[0, 0] = 1
kernel = kernel / np.sum(kernel)
print(kernel)

im4 = cv2.filter2D(im, -1, kernel)


# show picture
plt.figure(figsize=(7, 6))

ax = plt.subplot(1, 2, 1)
ax.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB))
ax.set_xticks([])
ax.set_yticks([])
ax.set_title('base image')

ax = plt.subplot(1, 2, 2)
ax.imshow(cv2.cvtColor(im4, cv2.COLOR_BGR2RGB))
ax.set_xticks([])
ax.set_yticks([])
ax.set_title('moved')

plt.show()

image.png Wenn nicht genug vorhanden ist, wird das Spiegelbild invertiert.

Durchschnittlicher Filter

Wenn alle Kernel den gleichen Wert und insgesamt 1 haben, wird dies zu einem Durchschnittsfilter. Gleich wie cv2.blur ().

python


def average_filter(size, im):
    kernel = np.ones(size**2).reshape(size, size)
    kernel = kernel / np.sum(kernel)
    im4 = cv2.filter2D(im, -1, kernel)
    return im4

plt.figure(figsize=(10, 5))
for k, size in enumerate([1, 21, 101]):
    im4 = average_filter(size, im)
    ax = plt.subplot(1, 3, k+1)

    ax.imshow(cv2.cvtColor(im4, cv2.COLOR_BGR2RGB))
    ax.set_title('size: %d' % size)
    ax.set_xticks([])
    ax.set_yticks([])
plt.show()

image.png

Filter zur Konturverbesserung

Wie unten gezeigt, wenn Sie die Summe auf 1 und alle außer der Mitte auf -1 setzen, um einen Konturverbesserungsfilter zu erstellen.

\begin{pmatrix}
-1 & -1 & -1 & -1 & -1 & -1 & -1 \\
-1 & -1 & -1 & -1 & -1 & -1 & -1 \\
-1 & -1 & -1 & -1 & -1 & -1 & -1 \\
-1 & -1 & -1 & 49 & -1 & -1 & -1 \\
-1 & -1 & -1 & -1 & -1 & -1 & -1 \\
-1 & -1 & -1 & -1 & -1 & -1 & -1 \\
-1 & -1 & -1 & -1 & -1 & -1 & -1
\end{pmatrix}

image.png

python


def edge_filter(size, im):
    kernel = np.full(size**2, -1).reshape(size, size)
    pos = int((size-1)/2)
    kernel[pos, pos] = size**2
    print(kernel)
    im4 = cv2.filter2D(im, -1, kernel)
    return im4

im4 = edge_filter(7, im)

plt.figure(figsize=(6, 5))

ax = plt.subplot(1, 2, 1)
ax.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB))
ax.set_title('base image')
ax.set_xticks([])
ax.set_yticks([])

ax = plt.subplot(1, 2, 2)
ax.imshow(cv2.cvtColor(im4, cv2.COLOR_BGR2RGB))
ax.set_title('edge added')
ax.set_xticks([])
ax.set_yticks([])

plt.show()

Konturextraktionsfilter

Es ähnelt dem obigen Filter, aber wenn Sie die Summe auf Null setzen, ist es ein Filter, der nur den Umriss extrahiert. image.png

python


def laplacian_filter(size, im):
    kernel = np.ones(size**2).reshape(size, size)
    pos = int((size-1)/2)
    kernel[pos, pos] = -(size**2-1)
    print(kernel)
    im4 = cv2.filter2D(im, -1, kernel)
    return im4

im4 = laplacian_filter(7, im)

plt.figure(figsize=(6, 5))

ax = plt.subplot(1, 2, 1)
ax.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB))
ax.set_title('base image')
ax.set_xticks([])
ax.set_yticks([])

ax = plt.subplot(1, 2, 2)
ax.imshow(cv2.cvtColor(im4, cv2.COLOR_BGR2RGB))
ax.set_title('laplacian filter')
ax.set_xticks([])
ax.set_yticks([])

plt.show()

(Geplant, hinzugefügt zu werden)

Recommended Posts

opencv-python Einführung in die Bildverarbeitung
[Einführung in TensorBoard: image] TensorFlow Visualisieren Sie die Bildverarbeitung, um das Verständnis zu vertiefen
Einführung in die Bildanalyse opencv python
[Bildverarbeitung] Posterisierung
Einführung in Scrapy (1)
Einführung in Scrapy (3)
Erste Schritte mit Supervisor
Einführung in Tkinter 1: Einführung
Python-Bildverarbeitung
Einführung in das Auffüllen von Python-Bildern Auffüllen von Bildern mit ImageDataGenerator
Einführung in PyQt
Einführung in Scrapy (2)
[Linux] Einführung in Linux
Einführung in Scrapy (4)
Einführung in discord.py (2)
Bildverarbeitung 100 Schläge ①
[Einführung in TensorBoard] Visualisieren Sie die TensorFlow-Verarbeitung, um das Verständnis zu vertiefen
Verwendung der PyTorch-basierten Bildverarbeitungsbibliothek "Kornia"
Einführung in Lightning Pytorch
Erste Python-Bildverarbeitung
Erste Schritte mit Web Scraping
Einführung in nichtparametrische Felder
Einführung in EV3 / MicroPython
Lesen Sie die digitale Bildverarbeitung
Einführung in die Python-Sprache
Einführung in die TensorFlow-Bilderkennung
Einführung in OpenCV (Python) - (2)
Einführung in PyQt4 Teil 1
Bildverarbeitung mit Python
Einführung in die Abhängigkeitsinjektion
Einführung in Private Chainer
Einführung in das maschinelle Lernen
Bildverarbeitung mit PIL
[Einführung in Python] Verwendung der while-Anweisung (wiederholte Verarbeitung)
100 Klopfen bei der Bildverarbeitung !! (021-030) Ich möchte eine Pause machen ...
[Kapitel 5] Einführung in Python mit 100 Klopfen Sprachverarbeitung
Einführung in die verteilte Parallelverarbeitung von Python durch Ray
[Kapitel 6] Einführung in Scicit-Learn mit 100 Klopfen Sprachverarbeitung
[Kapitel 3] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 2] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 4] Einführung in Python mit 100 Klopfen Sprachverarbeitung
AOJ Einführung in die Programmierung Thema Nr. 1, Thema Nr. 2, Thema Nr. 3, Thema Nr. 4
Einführung in das elektronische Papiermodul
Bildverarbeitung mit Python (Teil 2)
Einführung in den Wörterbuch-Suchalgorithmus
Einführung in die Monte-Carlo-Methode
OpenCV-Erkennt ähnliche Bildunterschiede in Python
Bildverarbeitung mit PIL (Pillow)
Einführung in Python Django (2) Win
Einführung in das Schreiben von Cython [Notizen]
Einführung in Private TensorFlow
Eine Einführung in das maschinelle Lernen
[Einführung in cx_Oracle] Übersicht über cx_Oracle
Eine super Einführung in Linux
AOJ Einführung in die Programmierung Thema Nr. 7, Thema Nr. 8