[PYTHON] Ich habe den Filterprozess von OpenCV untersucht

zunaechst

Ich habe den von OpenCV bereitgestellten Filterprozess untersucht

Betriebsumgebung

Python3,OpenCV

Einfache Glättungsverarbeitung (Unschärfe / Unschärfe)

Es wird angenommen, dass das Originalbild die folgenden Daten enthält (Graustufen), und es wird eine einfache Glättung (Unschärfe) durchgeführt. Untitled.png

Bei der einfachen Glättung wird der einfache Durchschnitt eines Rechtecks aus mehreren Pixeln, die jedes Pixel umgeben, als Wert für dieses Pixel verwendet. Da die Größe des Rechtecks (3 * 3) beträgt, wird es hier wie folgt berechnet. Untitled.png

Die Berechnung der Gesamtpixel ergibt: Untitled.png

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.cm as cm

black = [0x00, 0x00, 0x00]
white = [0xFF, 0xFF, 0xFF]

img = np.array([
                [black, black, black, black, black, black, black]
                ,[black, black, black, black, black, black, black]
                ,[black, black, white, white, white, black, black]
                ,[black, black, white, white, white, black, black]
                ,[black, black, white, white, white, black, black]
                ,[black, black, black, black, black, black, black]
                ,[black, black, black, black, black, black, black]                               
                ]
                , dtype=np.uint8)

#Graustufen
img = cv.cvtColor(img, cv.COLOR_RGB2GRAY)

#Diagrammzeichnungsbereich
fig = plt.figure(figsize=(8, 3))
ax1 = fig.add_subplot(121, projection='3d')
ax2 = fig.add_subplot(122, projection='3d')

# X,Y
_x = np.arange(img.shape[1])
_y = np.arange(img.shape[0])
_xx, _yy = np.meshgrid(_x, _y)
x, y = _xx.ravel(), _yy.ravel()
width = depth = 1

#Höhe
top = img.ravel()
bottom = np.zeros_like(top)

# 0-255 bis 0.0-1.Definition der Funktion, die in 0 konvertiert werden soll(Für Graustufenanzeige)
norm = colors.Normalize(0, 255)

#Original
color_values = cm.gray(top.tolist())
ax1.bar3d(x, y, bottom, width, depth, top, color=color_values)
ax1.set_title('Original')

#Unschärfe (Kernelgröße 3*3)
blurImg = cv.blur(img, (3, 3))
top = blurImg.ravel()
color_values = cm.gray(norm(top.tolist()))
ax2.bar3d(x, y, bottom, width, depth, top, color=color_values)
ax2.set_title('Blur')

plt.show()
Screen Shot 2020-05-30 at 14.47.09.png Screen Shot 2020-05-30 at 14.48.04.png

Medianfilterung

Der Medianfilter verwendet den Zwischenwert des Rechtecks, das jedes Pixel umgibt, als Wert für dieses Pixel. Untitled.png

Die Berechnung der Gesamtpixel ergibt: Untitled.png

#medianBlur (Kernelgröße 3)*3)
mBlurImg = cv.medianBlur(img, 3)
top = mBlurImg.ravel()
color_values = cm.gray(norm(top.tolist()))
ax2.bar3d(x, y, bottom, width, depth, top, color=color_values)
ax2.set_title('medianBlur')
Screen Shot 2020-05-30 at 15.00.22.png Screen Shot 2020-05-30 at 15.02.24.png

Gaußsche Filterung

Das Gaußsche Filter multipliziert das jedes Pixel umgebende Rechteck mit einer Matrix, die als Gaußscher Kern bezeichnet wird, und nimmt den Gesamtwert als Wert für dieses Pixel. Der hier verwendete 3 * 3-Gauß-Kernel ist wie folgt.

\begin{pmatrix}
1/16 & 2/16 & 1/16 \\
2/16 & 4/16 & 2/16 \\ 
1/16 & 2/16 & 1/16
\end{pmatrix}

Untitled.png

Pixel A wird berechnet als

import numpy as np

pixelA = np.array([[0, 0, 0]
                   ,[0, 255, 255]
                   ,[0, 255, 255]])
gaussKernel = np.array([[1/16, 2/16, 1/16]
                        ,[2/16, 4/16, 2/16]
                        ,[1/16, 2/16, 1/16]])
print(sum(sum(pixelA * gaussKernel))) 
#143  

Die Berechnung der Gesamtpixel ergibt: Untitled.png

# GaussianBlur
gBlurImg = cv.GaussianBlur(img, (3, 3), 0, 0)
top = gBlurImg.ravel()
color_values = cm.gray(norm(top.tolist()))
ax2.bar3d(x, y, bottom, width, depth, top, color=color_values)
ax2.set_title('GaussianBlur')
Screen Shot 2020-05-30 at 14.56.10.png Screen Shot 2020-05-30 at 14.57.17.png

Recommended Posts

Ich habe den Filterprozess von OpenCV untersucht
Ich habe 'Beauty' mit OpenCV ausprobiert
Ich habe den Gerätebaum untersucht
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Ich möchte Objekte mit OpenCV erkennen
Ich habe die Optionen von copyMakeBorder von OpenCV überprüft
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern