J'ai étudié le processus de filtrage fourni par OpenCV
Python3,OpenCV
L'image d'origine est supposée être les données suivantes (échelle de gris) et un simple lissage (flou) est effectué.
Le lissage simple prend la moyenne simple d'un rectangle de plusieurs pixels entourant chaque pixel comme valeur de ce pixel. Ici, puisque la taille du rectangle est (3 * 3), elle est calculée comme suit.
Le calcul du nombre total de pixels donne:
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)
#Échelle de gris
img = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
#Zone de dessin graphique
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
#la taille
top = img.ravel()
bottom = np.zeros_like(top)
# 0-255 à 0.0-1.Définition de la fonction à convertir en 0(Pour l'affichage en échelle de gris)
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')
#Flou (taille du noyau 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()
Le filtre médian prend la valeur intermédiaire du rectangle qui entoure chaque pixel comme valeur de ce pixel.
Le calcul du nombre total de pixels donne:
#medianBlur (taille du noyau 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')
Le filtre gaussien multiplie le rectangle entourant chaque pixel par une matrice appelée noyau gaussien et prend la valeur totale comme valeur de ce pixel. Le noyau gaussien 3 * 3 utilisé ici est le suivant.
\begin{pmatrix}
1/16 & 2/16 & 1/16 \\
2/16 & 4/16 & 2/16 \\
1/16 & 2/16 & 1/16
\end{pmatrix}
Le pixel A est calculé comme
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
Le calcul du nombre total de pixels donne:
# 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