[PYTHON] J'ai examiné le processus de filtrage d'OpenCV

en premier

J'ai étudié le processus de filtrage fourni par OpenCV

Environnement d'exploitation

Python3,OpenCV

Traitement simple de lissage (flou / flou)

L'image d'origine est supposée être les données suivantes (échelle de gris) et un simple lissage (flou) est effectué. Untitled.png

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. Untitled.png

Le calcul du nombre total de pixels donne: 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)

#É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()
Screen Shot 2020-05-30 at 14.47.09.png Screen Shot 2020-05-30 at 14.48.04.png

Filtrage médian

Le filtre médian prend la valeur intermédiaire du rectangle qui entoure chaque pixel comme valeur de ce pixel. Untitled.png

Le calcul du nombre total de pixels donne: Untitled.png

#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')
Screen Shot 2020-05-30 at 15.00.22.png Screen Shot 2020-05-30 at 15.02.24.png

Filtrage gaussien

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}

Untitled.png

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: 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

J'ai examiné le processus de filtrage d'OpenCV
J'ai essayé 'Beauté' avec OpenCV
J'ai examiné l'arborescence des appareils
J'ai essayé la reconnaissance faciale avec OpenCV
Je veux détecter des objets avec OpenCV
J'ai vérifié les options de copyMakeBorder d'OpenCV
J'ai essayé le rendu non réaliste avec Python + opencv