Ich habe den von OpenCV bereitgestellten Filterprozess untersucht
Python3,OpenCV
Es wird angenommen, dass das Originalbild die folgenden Daten enthält (Graustufen), und es wird eine einfache Glättung (Unschärfe) durchgeführt.
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.
Die Berechnung der Gesamtpixel ergibt:
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()
Der Medianfilter verwendet den Zwischenwert des Rechtecks, das jedes Pixel umgibt, als Wert für dieses Pixel.
Die Berechnung der Gesamtpixel ergibt:
#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')
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}
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:
# 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')
Recommended Posts