Pratiquez ceci pour améliorer les capacités techniques du prétraitement d'image 100 coups pour le traitement d'image !! Je vais le faire avec Colaboratory pour qu'il soit facile de démarrer. Nous travaillerons pour atteindre l'objectif dans deux semaines. Je vais l'expliquer soigneusement. Veuillez poser une question!
Introduit les bibliothèques, etc. comme suit.
python
#Importer la bibliothèque
from google.colab import drive
import numpy as np
import matplotlib.pyplot as plt
import cv2
from google.colab.patches import cv2_imshow
#Chargement des images
img = cv2.imread('Chemin de l'image/imori.jpg')
img_noise = cv2.imread('Chemin de l'image/imori_noise.jpg')
#Pour le stockage d'images
OUT_DIR = 'Chemin de destination de sortie/OUTPUT/'
Chargez l'image et remplacez RVB dans l'ordre BGR. Vous pouvez utiliser le code suivant pour extraire le composant rouge de l'image. Notez que dans la fonction cv2.imread (), les canaux sont dans l'ordre BGR! Cela met uniquement le composant rouge de imori.jpg dans la variable red.
A1
#OpenCV, fonction cvtColor()Convertissez BGR et RVB avec
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#Sauvegarder le résultat
cv2.imwrite(OUT_DIR + 'ans1_a.jpg', img1)
#Afficher l'image
cv2_imshow(img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
Référence: cvtColor qui convertit BGR et RVB avec Python, OpenCV
Faites l'échelle de gris de l'image. L'échelle de gris est une sorte de méthode d'expression de la luminosité de l'image et est calculée par la formule suivante. Y = 0.2126 R + 0.7152 G + 0.0722 B
A2
#Fonction OpenCV cv2.cvtColor(), cv2.COLOR_Convertir avec BGR2GRAY
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Sauvegarder le résultat
cv2.imwrite(OUT_DIR + 'ans2_.jpg', img2)
#Afficher l'image
cv2_imshow(img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
Référence: Convertir une image couleur en noir et blanc (échelle de gris) avec Python, OpenCV, NumPy
Binarisez l'image. La binarisation est une méthode d'expression d'une image avec deux valeurs, noir et blanc. Ici, le seuil est fixé à 128 dans l'échelle de gris et binarisé par l'équation suivante.
A3
#image(niveaux de gris)copie de
img3 = img2.copy()
#Définition du seuil
threshold = 128
#Binarisation(Le nombre de pixels dépassant le seuil 128 est défini sur 255.)
ret, img3 = cv2.threshold(img3, threshold, 255, cv2.THRESH_BINARY)
#Sauvegarder le résultat
cv2.imwrite(OUT_DIR + 'ans3_.jpg', img3)
#Afficher l'image
cv2_imshow(img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
Référence: Dualification of OpenCV image Référence: Traitement du seuil d'image
Implémentez la binarisation d'Otsu. La binarisation d'Otsu est appelée une méthode d'analyse discriminante, qui est une méthode de détermination automatique du seuil de séparation lors de la binarisation. Ceci est calculé à partir du rapport de la distribution intra-classe à la distribution inter-classe.
A4
#Implémenté dans OpenCV
#image(niveaux de gris)copie de
gray = img2.copy()
#Processus de binarisation d'Otsu
ret, image4 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
#Sauvegarder le résultat
cv2.imwrite(OUT_DIR + 'ans4.jpg', img4)
#Afficher l'image
cv2_imshow(img4)
cv2.waitKey(0)
cv2.destroyAllWindows()
Référence: [Python / OpenCV] Binarisation à l'aide de la méthode d'Otsu
Implémentez la conversion HSV pour inverser la teinte H. La conversion HSV est une méthode d'expression des couleurs avec Teinte (teinte), Saturation (saturation) et Valeur (luminosité). Teinte ... Exprime la teinte de 0 à 360 degrés et indique le type de couleur comme le rouge ou le bleu. (0 <= H <360) La teinte correspond aux couleurs suivantes. Rouge Jaune Vert Bleu Clair Bleu Violet Rouge 0 60 120 180 240 300 360 Saturation ... éclat des couleurs. Lorsque la saturation est faible, la couleur grise devient perceptible et la couleur devient terne. (0 <= S <1) Valeur ... Luminosité des couleurs. Plus la valeur est élevée, plus le blanc est proche et plus la valeur est basse, plus le noir est proche. (0 <= V <1)
A5
#Copiez l'image
img5 = img.copy()
# RGB ->Convertir en HSV
hsv = cv2.cvtColor(img5, cv2.COLOR_BGR2HSV)
#Ajouter 180 à la teinte
hsv[..., 0] = (hsv[..., 0] + 180) % 360
# HSV ->Convertir en RVB
img5 = cv2.cvtColor(hsv, cv2.COLOR_HSV2RGB)
#Sauvegarder le résultat
cv2.imwrite(OUT_DIR + 'ans5.jpg', img5)
#Afficher l'image
cv2_imshow(img5)
cv2.waitKey(0)
cv2.destroyAllWindows()
Pour une raison quelconque, il est légèrement différent de l'image de réponse. S'il vous plaît laissez-moi savoir si vous faites une erreur
Référence: [Python / OpenCV] Convertir de RVB en HSV (cv2.cvtColor)](https://algorithm.joho.info/programming/python/opencv-rgb-to-hsv-color-space/)
Ici, réduisez les valeurs d'image de 256 ^ 3 à 4 ^ 3, c'est-à-dire R, V, B dans {32, 96, 160, 224}. Il s'agit d'une opération de quantification. Chaque valeur est définie comme suit.
A6
def decrease_color(img):
"""
R,G,Réglez B sur 256 et définissez une valeur sur 4.
[0, 64), [64, 128), [128, 192), (192, 256)Divisez en 4 parties égales *[]: Section fermée(Ci-dessus et ci-dessous), (): Section ouverte(Grand ou petit)
[0, 64)->32, [64, 128)->96, [128, 192)->160, (192, 256) ->Convertir chaque plage en 2224
parameters
-------------------------
param: numpy.image au format ndarray
returns
-------------------------
numpy.ndarray format Convertir comme indiqué à droite[132 80 67] >>> [160 96 96]
"""
#Copier l'image
out = img.copy()
print(out)
# 256/4 =Parce qu'il est 64, il est divisé par 64+32 en faisant 32, 96, 160,Transformer en 224
out = out // 64 * 64 + 32
return out
img6 = img.copy()
img6 = decrease_color(img6)
#Sauvegarder le résultat
cv2.imwrite(OUT_DIR + 'ans6.jpg', img6)
#Afficher l'image
cv2_imshow(img6)
cv2.waitKey(0)
cv2.destroyAllWindows()
Référence: Somehow blog
Ici, l'image est divisée en grilles (divisée en certaines zones de longueur fixe), et les valeurs de la zone sont remplies avec la valeur moyenne de la zone (cellule). L'opération consistant à diviser la grille de cette manière et à trouver la valeur représentative dans la zone est appelée mise en commun. Ces opérations de mise en commun jouent un rôle important dans CNN (Convolutional Neural Network).
A7
def average_pooling(img, G=8):
"""
Mise en commun moyenne
parameters
-------------------------
param1: numpy.image au format ndarray
param2:Division de la grille en 8x8
returns
-------------------------
Nombre moyen mis en commun.image au format ndarray
"""
#Copier l'image
out = img.copy()
# H(Hauteur de l'image), W(Largeur de l'image), C(Couleur)Avoir
H, W, C = img.shape
#Division du réseau
Nh = int(H / G)
Nw = int(W / G)
#Regroupement moyen pour chaque plage divisée en 8
for y in range(Nh):
for x in range(Nw):
for c in range(C):
out[G*y:G*(y+1), G*x:G*(x+1), c] = np.mean(out[G*y:G*(y+1), G*x:G*(x+1), c]).astype(np.int)
return out
#Mise en commun moyenne
img7 = average_pooling(img)
#Sauvegarder le résultat
cv2.imwrite(OUT_DIR + 'ans7.jpg', img7)
#Afficher l'image
cv2_imshow(img7)
cv2.waitKey(0)
cv2.destroyAllWindows()
Ici, pool avec la valeur maximale au lieu de la valeur moyenne.
A8
def max_pooling(img, G=8):
"""
Mise en commun maximale
parameters
-------------------------
param1: numpy.image au format ndarray
param2:Division de la grille en 8x8
returns
-------------------------
Nombre maximum groupé.image au format ndarray
"""
#Copier l'image
out = img.copy()
# H(Hauteur de l'image), W(Largeur de l'image), C(Couleur)Avoir
H, W, C = img.shape
#Division du réseau
Nh = int(H / G)
Nw = int(W / G)
#Regroupement moyen pour chaque plage divisée en 8
for y in range(Nh):
for x in range(Nw):
for c in range(C):
out[G*y:G*(y+1), G*x:G*(x+1), c] = np.max(out[G*y:G*(y+1), G*x:G*(x+1), c]).astype(np.int)
return out
#Mise en commun maximale
img8 = average_pooling(img)
#Sauvegarder le résultat
cv2.imwrite(OUT_DIR + 'ans8.jpg', img8)
#Afficher l'image
cv2_imshow(img8)
cv2.waitKey(0)
cv2.destroyAllWindows()
Implémentez un filtre gaussien (3x3, écart type 1,3) pour supprimer le bruit dans imori_noise.jpg. Le filtre gaussien est un type de filtre qui lisse (lisse) l'image, et est également utilisé pour la suppression du bruit. D'autres méthodes d'élimination du bruit comprennent un filtre médian (Q.10), un filtre de lissage (Q.11) et un filtre LoG (Q.19). Le filtre gaussien lisse les pixels périphériques du pixel d'intérêt par pondération avec une distribution gaussienne, et est défini par l'équation suivante. Ces poids sont appelés noyaux ou filtres. Cependant, comme les bords de l'image ne peuvent pas être filtrés tels quels, la partie avec des pixels insuffisants est remplie de 0. C'est ce qu'on appelle le remplissage 0. Et les poids sont normalisés. (somme g = 1)
A9
#Traité par OpenCV
# cv2.GaussianBlur(src, ksize, sigmaX)
# src:Image d'entrée, ksize:Taille du noyau, sigmaX:Distribution gaussienne sigma_x
img9 = cv2.GaussianBlur(img_noise, ksize=(3, 3), sigmaX=1.3)
#Sauvegarder le résultat
cv2.imwrite(OUT_DIR + 'ans9.jpg', img9)
#Afficher l'image
cv2_imshow(img9)
cv2.waitKey(0)
cv2.destroyAllWindows()
Référence: [Python / OpenCV] Blur / Smooth with Gaussian Filter
Implémentez un filtre médian (3x3) pour supprimer le bruit de imori_noise.jpg. Un filtre médian est un type de filtre qui lisse une image. Il s'agit d'un filtre qui génère la valeur médiane (valeur médiane) dans la zone 3x3 du pixel d'intérêt. Il s'agit également de zéro remplissage.
A10
#Traité par OpenCV
"""
cv2.medianBlur(src, ksize)
image d'entrée src
Taille du noyau du filtre du noyau (près de 8 si 3)
"""
#Filtre médian
img10 = cv2.medianBlur(img_noise, ksize=3)
#Sauvegarder le résultat
cv2.imwrite(OUT_DIR + 'ans10.jpg', img10)
#Afficher l'image
cv2_imshow(img10)
cv2.waitKey(0)
cv2.destroyAllWindows()
Référence: [Python / OpenCV] Blur / Smooth / Noise Removal with Median Filter
Le prétraitement est important dans l'apprentissage automatique. Si vous ne connaissez pas la méthode, vous ne proposerez aucune idée, donc cela en vaut la peine. Le format Knock facilite le travail
Recommended Posts