Introduction à OpenCV (python) - (2)

Ceci est une suite de l'article suivant (je veux faire quelque chose car il n'y a que des articles d'entrée ...)

https://qiita.com/tom_S/items/b85aee14f34dcc856e54

histogramme

Il est possible d'exprimer la distribution des valeurs de pixels comme s'il y a beaucoup de rouge ou beaucoup de bleu dans l'image.

Le programme qui affiche un histogramme des valeurs RVB sous forme de graphique est illustré ci-dessous.

import cv2
import matplotlib.pyplot as plt #Bibliothèque de tracés d'images
%matplotlib inline #Bibliothèque de tracés d'images

img = cv2.imread("Chemin du fichier image ici")

color_list = ["blue", "green","red"]
for i,j in enumerate(color_list):
    hist = cv2.calcHist([img],[i],None,[256],[0,256]) # blue, green,Calculer dans l'ordre du rouge
    plt.plot(hist,color= j)

En outre, en uniformisant l'histogramme, la partie claire peut être rendue plus claire et la partie sombre peut être rendue plus sombre. Uniformisez l'histogramme en appelant la fonction equalizeHist comme suit:

import cv2

img = cv2.imread("Chemin du fichier image ici")
img_eq = cv2.equalizeHist(img) # img_Une image avec un histogramme en uniforme est incluse dans l'eq

Conversion gamma

En gros, la méthode de modification de la luminosité d'une image est appelée conversion gamma. La conversion est effectuée à l'aide d'une table gamma (table de consultation) telle que la formule suivante. Lorsque la valeur de r est supérieure à 1, elle devient plus claire et lorsqu'elle est inférieure à 1, elle devient plus sombre.

y = 255* (x/255)^(1/r)

Le code source est indiqué ci-dessous. (L'explication de la table de recherche est omise)

import cv2
import numpy as np

gamma = 1.5 #R dans l'équation ci-dessus
img = cv2.imread("Chemin du fichier image ici")
gamma_cvt = np.zeros((256,1), dtype= np.uint8)
for i in range(256):
    gamma_cvt[i][0] = 255 * (float(i)/255) ** (1.0/gamma)
    
img_gamma = cv2.LUT(img, gamma_cvt) #img_L'image après la conversion gamma est entrée en gamma

Je pense qu'il est difficile de comprendre quel genre d'effet cela a, alors je vais mettre un lien vers un site qui semble être utile ci-dessous. http://peaceandhilightandpython.hatenablog.com/entry/2016/02/05/004445

Conversion Afine

La transformation d'affination est une combinaison de mouvement parallèle et de rotation qui déplace une image et de transformation qui transforme un rectangle en quadrilatère parallèle (déformation par cisaillement). La conversion d'affination est effectuée en effectuant un calcul matriciel.

Puisqu'il est nécessaire de faire la somme des matrices pour un mouvement parallèle, ajoutez des coordonnées homogènes à la matrice afin de réduire la transformation linéaire et créez une matrice de transformation pour faire une expression entre des termes singuliers. Affiche le code source pour le mouvement parallèle et la rotation

Mouvement parallèle

import cv2
import numpy as np

img = cv2.imread("Chemin du fichier image ici")
h,w = img.shape[:2]
dx,dy = 30,30

afn_mat = np.float32([[1,0,dx],[0,1,dy]]) #Seul mouvement parallèle. Décaler de 30 verticalement et horizontalement
img_afn = cv2.warpAffine(img, afn_mat,(w,h)) # img_L'image après un mouvement parallèle est entrée dans afn

rotation

import cv2
import numpy as np

img = cv2.imread("Chemin du fichier image ici")
h,w = img.shape[:2]

rot_mat = cv2.getRotationMatrix2D((w/2,h/2),40,1) # (Coordonnées du centre de rotation,angle de rotation,Échelle de l'image(1 est la même taille))donner
img_afn2 = cv2.warpAffine(img, rot_mat,(w,h)) # img_L'image après rotation est incluse dans afn

Plier

La mise à jour de votre propre valeur de pixel en utilisant les informations environnantes est appelée convolution.

Comment plier

  1. Préparez un filtre

  2. Effectuez "(valeur du pixel) x (filtre)" autour du pixel d'intérêt et ajoutez (cela s'appelle le pliage)

  3. Placez sur tous les pixels et pliez

Filtres utilisant la convolution

Filtre lissant

La valeur de pixel est calculée à partir des informations environnantes et le bruit est supprimé. Le code source est affiché ci-dessous

import cv2 
import numpy as np

kernel = np.ones((3,3)) /9.0 #Filtre utilisé pour le pliage

img = cv2.imread("Chemin du fichier image ici", 0)
img_kel = cv2.filter2D(img, -1, kernel) #Argument "-1 "est l'image d'origine(img)Moyens de revenir.Effectuer le pliage (lissage)

filtre Sobel

Les bords verticaux peuvent être détectés par différenciation. Un exemple de code source est présenté ci-dessous.

import cv2 
import numpy as np

kernel2 = np.zeros((3,3))
kernel2[0,0] = 1
kernel2[1,0] = 2
kernel2[2,0] = 1
kernel2[0,2] = -1
kernel2[1,2] = -2
kernel2[2,2] = -1

img = cv2.imread("Chemin du fichier image ici", 0)
img_ke2 = cv2.filter2D(img, -1,kernel2) #filtre Sobel

Filtre lissant

Un filtre qui lisse et estompe uniformément toute la surface. Le code source est indiqué ci-dessous.

import cv2 

img = cv2.imread("Chemin du fichier image ici")

img_blur = cv2.blur(img, (3,3)) #Filtre lissant
img_ga = cv2.GaussianBlur(img,(9,9), 2) #2 est la valeur de distribution. Plus cette valeur est élevée, plus floue(Gaushan)
img_me = cv2.medianBlur(img, 5) #Réécrire avec la valeur la plus fréquente(Flou)Filtre médian

Il existe un filtre bilatéral pour la conversion non linéaire. Il s'agit de laisser la partie où le changement de luminosité est drastique et de lisser la partie où le changement de luminosité est progressif. Le code source est indiqué ci-dessous.

import cv2 

img = cv2.imread("Chemin du fichier image ici")

img_bi = cv2.bilateralFilter(img,20,30,30)

Arithmétique de la morphologie

Une opération d'expansion et de contraction Elle permet de séparer les images en se contractant et de les intégrer en agrandissant. De plus, le bruit peut être éliminé par contraction et expansion. Le code source est indiqué ci-dessous.

import cv2

img = cv2.imread("Chemin du fichier image ici")
ret, img_th = cv2.threshold(img, 110, 255, cv2.THRESH_BINARY) #Binarisation

kernel = np.ones((3,3),dtype = np.uint8) #S'il y a du blanc aux alentours de 8, ce sera blanc, s'il y a beaucoup de noir, ce sera noir
img_d = cv2.dilate(img_th, kernel)
img_e = cv2.erode(img_th,kernel)

img_c = cv2.morphologyEx(img_th,cv2.MORPH_CLOSE, kernel) # img_L'image après le calcul est entrée dans c
# MORPH_CLOSE:Effectue un processus de contractualisation après l'expansion
# (MORPH_En spécifiant OPEN, il est également possible de se dilater après la contraction.)

Extraction de caractéristiques

――Les caractéristiques sont des parties contenant beaucoup d'informations. Il existe les trois fonctionnalités suivantes. Pour l'extraction de caractéristiques, vous trouverez un vecteur propre avec une grande valeur propre dans l'image.

--Flat: Il n'y a pas de direction dans l'image. Le vecteur propre n'est pas biaisé et la valeur propre est petite (moins de caractéristiques)

--Bord: il y a un vecteur propre avec une valeur propre plus grande dans l'image (plus caractéristique que plat)

--Coin: Il y a deux vecteurs propres avec de grandes valeurs propres dans l'image (nombreuses fonctionnalités)

Extracteur de fonctionnalités

Extracteur La description
Harris Si l'échelle change, la précision diminuera. Les caractéristiques sont extraites par des valeurs propres et des vecteurs propres
SIFT Le nombre de fonctionnalités est de 128 dimensions. Non disponible pour un usage commercial en raison de l'acquisition de brevets
SURF Accélérez SIFT. Non disponible pour un usage commercial en raison de l'acquisition de brevets
ORB Quantité de fonctionnalités binarisées. Facile et recommandé
KAZE Utilise un filtre non linéaire. Facile et recommandé
AKAZE Une version plus rapide de KAZE. Facile et recommandé

Comment afficher le code source de chaque extracteur.

import cv2
import numpy as np
import copy

img = cv2.imread("Chemin du fichier image ici")
img_g = cv2.imread("Chemin du fichier image ici",0)

# Harris
img_harris = copy.deepcopy(img)
img_dst = cv2.cornerHarris(img_g, 2,3,0.04)
#2 est la taille du bloc. Quelle distance doit être détectée? Si vous faites grand, la quantité d'extraction augmentera

# KAZE
img_kaze = copy.deepcopy(img)
kaze = cv2.KAZE_create() #Créer un extracteur de fonctionnalités(KAZE)
kp1 = kaze.detect(img,None)
img_kaze = cv2.drawKeypoints(img_kaze, kp1, None) #L'image marquée dans la partie caractéristique est img_Entrez kaze

# AKAZE
img_kaze = copy.deepcopy(img)
kaze = cv2.AKAZE_create() #Créer un extracteur de fonctionnalités(AKAZE)
kp1 = kaze.detect(img,None)
img_kaze = cv2.drawKeypoints(img_kaze, kp1, None) #L'image marquée dans la partie caractéristique est img_Entrez kaze

# ORB
img_orb = copy.deepcopy(img)
orb = cv2.ORB_create() #Créer un extracteur de fonctionnalités(ORB)
kp2 = orb.detect(img_orb)
img_orb = cv2.drawKeypoints(img_orb, kp2, None) #L'image marquée dans la partie caractéristique est img_Entrez orb

Recommended Posts

Introduction à OpenCV (python) - (2)
Introduction à l'analyse d'image opencv python
Introduction au langage Python
Introduction à Python Django (2) Win
Introduction à la communication série [Python]
[Introduction à Python] <liste> [modifier le 22/02/2020]
Introduction à Python (version Python APG4b)
Une introduction à la programmation Python
Introduction à Python pour, pendant
[Présentation de l'application Udemy Python3 +] 58. Lambda
Introduction à la bibliothèque de calcul numérique Python NumPy
Entraine toi! !! Introduction au type Python (conseils de type)
[Introduction à Python3 Jour 1] Programmation et Python
[Introduction à Python] <numpy ndarray> [modifier le 22/02/2020]
[Présentation de l'application Udemy Python3 +] 57. Décorateur
Introduction à Python Hands On Partie 1
[Introduction à Python3 Jour 13] Chapitre 7 Chaînes de caractères (7.1-7.1.1.1)
[Introduction à Python] Comment analyser JSON
[Présentation de l'application Udemy Python3 +] 56. Clôture
[Introduction à Python3 Jour 14] Chapitre 7 Chaînes de caractères (7.1.1.1 à 7.1.1.4)
Introduction à Protobuf-c (langage C ⇔ Python)
[Présentation de l'application Udemy Python3 +] 59. Générateur
[Introduction à Python3 Jour 15] Chapitre 7 Chaînes de caractères (7.1.2-7.1.2.2)
[Introduction à Python] Utilisons les pandas
[Introduction à Python] Utilisons les pandas
[Introduction à l'application Udemy Python3 +] Résumé
[Introduction à Python] Utilisons les pandas
Premiers pas avec Python pour les non-ingénieurs
Introduction à Python Django (2) Édition Mac
[AWS SAM] Présentation de la version Python
[Introduction à Python3 Day 21] Chapitre 10 Système (10.1 à 10.5)
[Tutoriel Python] Une introduction facile à Python
Introduction à MQTT (Introduction)
Introduction à Scrapy (1)
Introduction à Scrapy (3)
Mis à jour vers Python 2.7.9
Introduction à Tkinter 1: Introduction
Python2.7 + CentOS7 + OpenCV3
Introduction à PyQt
[Linux] Introduction à Linux
Introduction à Scrapy (4)
Exemples OpenCV (Python)
Introduction à discord.py (2)
[Remarque] openCV + python
"Backport" vers python 2
Introduction de Python
[Introduction à Udemy Python3 + Application] 18. Méthode List
[Introduction à Udemy Python3 + Application] 63. Notation d'inclusion du générateur
[Introduction à l'application Udemy Python3 +] 28. Type collectif
[Introduction à Udemy Python3 + Application] 25. Méthode de type dictionnaire
[Introduction à l'application Udemy Python3 +] 33. instruction if
Introduction à la simulation d'événements discrets à l'aide de Python # 1
[Introduction à Udemy Python3 + Application] 13. Méthode de caractères
[Introduction à Python3, jour 17] Chapitre 8 Destinations de données (8.1-8.2.5)
[Introduction à l'application Udemy Python3 +] 55. Fonctions intégrées
[Introduction à l'application Udemy Python3 +] 48. Définition des fonctions
[Introduction à Python3, jour 17] Chapitre 8 Destinations de données (8.3-8.3.6.1)
Super Introduction Arithmétique Bit Python
[Introduction à l'application Udemy Python3 +] 10. Valeur numérique