Collection de traitement d'image en Python

Un mémorandum des fonctions de la bibliothèque de traitement d'image souvent utilisée en Python. Sera mis à jour de temps en temps.

On suppose que les bibliothèques suivantes sont importées Library Version opencv @3.2.0_1+contrib+python27 scikit-image @0.12.3_2 scipy @0.19.0_0+gfortran

import numpy as np
import copy
import cv2 as cv
import skimage
import skimage.io as sk
import skimage.filters as fil
import skimage.filters.rank as rank
import skimage.morphology as mor
import skimage.transform as tr
import scipy.misc as sp
import scipy.ndimage as ndi

Read Image Comparaison par bibliothèque utilisée pour charger les images

scikit-image

img = sk.imread(filename,as_grey=False,plugin=None,flatten=None)

OpenCV

img = cv.imread((filename[, flags])

SciPy

img = sp.imread(name, flatten=False, mode=None)

Binalization

Fondamentalement, seul Otsu est utilisé pour la binarisation des images, mais d'autres méthodes sont également utilisées en fonction de l'objectif, donc pour référence.

scikit-image

#Trouvez le seuil pour chaque méthode de binarisation
thrOtsu = fil.threshold_otsu(img)
thrli = fil.threshold_li(img)
thrIso = fil.threshold_isodata(img)
thrYen = fil.threshold_yen(img)

#Binarisation
thrImg = ((thrOtsu < img) * 255).astype(np.uint8)

binalization.001.jpeg

OpenCV

Lorsque vous ne l'utilisez pas du tout, mais que vous utilisez OpenCV de manière cohérente, comme la lecture.

thr, thrImg = cv.threshold(img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)

Filtering

Il est principalement utilisé pour la suppression du bruit effectuée en tant que prétraitement du traitement d'image. Pour la suppression du bruit, il est nécessaire d'utiliser différents filtres en fonction du type de bruit et des caractéristiques de l'image. Par conséquent, la configuration ici est résumée pour chaque type de filtrage afin qu'il puisse être utilisé correctement.

Gaussian Fitering Pliez avec un noyau pondéré qui suit une distribution gaussienne. Utilisé pour le lissage général de l'image.

#Distribution de distribution normale
sigma = 1
#Taille du noyau
ksize = (3, 3)

# OpenCV
gauImg = cv.GaussianBlur(img, ksize=ksize, sigmaX=sigma)

# SciPy
gauImg = ndi.gaussian_filter(img, sigma=sigma)

# scikit-image
#Si img est un type float-1~Doit être normalisé à 1
gauImg = fil.gaussian_filter(img, sigma=sigma)

Mean Filtering

Replier avec un noyau de poids moyen. Il est utilisé pour supprimer les bruits fins tels que les bruits uniformes.

#Taille du noyau
ksize = (5, 5)
#Noyau de poids avec un rayon de 20 pixels
selem = disk(20)

# OpenCV
meanImg = cv.blur(img, ksize=ksize)

# scikit-image
#Si img est un type float-1~Doit être normalisé à 1
meanImg = rank.mean(img, selem=selem)

Median Filtering

Filtrage médian. Il est utilisé pour supprimer les bruits de pointe tels que les bruits de sel de sésame.

#Taille du noyau
ksize = 3
#Noyau de poids avec un rayon de 20 pixels
selem = disk(20)

# OpenCV
medImg = cv.medianBlur(img, ksize=ksize)

# scikit-learn
#Si img est un type float-1~Doit être normalisé à 1
medImg = rank.median(img, selem=selem)

Bilateral Filtering

Etant donné que le filtrage gaussien lisse même les pixels caractéristiques tels que les bords, cela devient un problème en fonction du traitement d'image ultérieur. Par conséquent, le filtrage bilatéral peut effectuer un lissage tout en préservant les bords. La différence décisive par rapport au filtrage gaussien n'est pas seulement la distribution gaussienne concernant la différence de distance par rapport au centre du noyau, mais également le noyau pondéré selon la distribution gaussienne concernant la différence de luminosité par rapport à la valeur de luminosité centrale.

#Taille du noyau
d = 5
#Dispersion de la valeur de luminosité Distribution gaussienne
sigmaColor = 1
#Dispersion de la différence de distance Distribution gaussienne
sigmaSpace = 1

# OpenCV
biImage = cv.bilateralFilter(img, d=d, sigmaColor=sigmaColor, sigmaSpace=sigmaSpace)

Morphological Operation

Il effectue principalement des traitements qui affectent considérablement le traitement d'image ultérieur, comme la suppression des niveaux de gris et du bruit de fond des images binaires, et l'extraction des caractéristiques. Cette section résume également chaque processus arithmétique de morphologie. Personnellement, je pense qu'il serait préférable d'emprunter uniquement Dilation et Erosion à la bibliothèque et de créer des fonctions d'ouverture et de fermeture de différentes manières.

Dilation

Processus d'expansion d'un objet dans une image binaire.

#Taille du noyau
kernel = np.ones((3,3),np.uint8)
#Nombre d'essais
iterations = 2

# OpenCV
dilImg = cv.dilate(thrImg, kernel=kernel, iterations=iterations)

# scikit-image
dilImg = mor.dilation(thrImg, selem=kernel)

Erosion

Processus de réduction d'un objet image binaire.

# OpenCV
eroImg = cv.erode(thrImg, kernel=kernel, iterations=iterations)

# scikit-image
eroImg = mor.erosion(thrImg, selem=kernel)

Opening

Il est utilisé lorsque vous souhaitez supprimer les petits bruits. La dilatation est effectuée le même nombre de fois après plusieurs érosions. A ce moment, le nombre de fois de chaque traitement dépend de l'amplitude du bruit à supprimer.

# OpenCV
openImg = cv.morphologyEx(thrImg, cv.MORPH_OPEN, kernel=kernel, iterations=iterations)

# scikit-image
openImg = mor.opening(thrImg, selem=kernel)

Closing

Il est utilisé pour combler les trous qui se produisent lorsqu'un objet ne peut pas être binarisé proprement en raison de l'influence du bruit et de la nature de l'image. L'érosion est effectuée le même nombre de fois après plusieurs dilatations. A ce moment, le nombre de traitements dépend de la taille du trou à remplir.

# OpenCV
closeImg = cv.morphologyEx(thrImg, cv.MORPH_CLOSE, kernel=kernel, iterations=iterations)

# scikit-image
closeImg = mor.closing(thrImg)

White Top-Hat

Il est utilisé pour extraire de petits motifs de caractéristiques qui existaient en arrière-plan en extrayant la différence entre l'image ouverte et l'image d'origine.

# OpenCV
wthImg = cv.morphologyEx(thrImg, cv.MORPH_TOPHAT, kernel=kernel, iterations=iterations)

# scikit-image
wthImg = mor.white_tophat(thrImg)

Black Top-Hat

Il est utilisé pour extraire de petits motifs de caractéristiques qui existaient dans l'objet en calculant la différence entre l'image fermée et l'image d'origine.

# OpenCV
bthImg = cv.morphologyEx(thrImg, cv.MORPH_BLACKHAT, kernel=kernel, iterations=iterations)

# scikit-image
bthImg = mor.black_tophat(thrImg)

morphorogy2.001.jpeg

Labeling

binaire Un processus pour étiqueter chaque zone de segment dans une image. Il est principalement utilisé pour l'analyse quantitative après binarisation (zone de recherche, coordonnées du centre de gravité, etc.). Il ne prend en charge que les images bidimensionnelles, mais j'ai essayé de l'utiliser car il y avait une fonction pratique dans OpenCV.

#Nombre d'étiquettes(nlabel)Et étiqueter l'image(labImg)seulement
nlabel, labImg = cv.connectedComponents(img)

#Boîte englobante en plus du haut+zone(stats)Et coordonnées du centre de gravité(centroids)Aussi obtenir
nlabel, labImg, stats, centroids = cv.connectedComponentsWithStats(img)

stats: Liste [x, y, largeur, hauteur, surface] pour chaque étiquette centroïde: stocke également les coordonnées du centre de gravité [x, y] dans une liste correspondant à l'étiquette

Le résultat de son utilisation réelle pour les images suivantes est affiché. unko_img.002.png

img = sk.imread('unko.png')
gimg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
thrOtsu = fil.threshold_otsu(gimg)
thrImg = ((thrOtsu > img) * 255).astype(np.uint8)
nlabel, labelImg, stats, centroids = cv.connectedComponentsWithStats(thrImg)
colors = []
for n in range(1, nlabel):
   #Recadrer chaque merde
   tmpImg = img[stats[n][1]:stats[n][1]+stats[n][3], stats[n][0]:stats[n][0]+stats[n][2]] sk.imsave('unko' + str(n) + '.png', tmpImg)
   color.append(np.array([random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)]))
leny, lenx = labelImg.shape
colorImg = np.zeros((leny, lenx, 3)).astype(np.uint8)
for x in range(lenx):
   for y in range(leny):
      for n in range(1, nlabel):
         #Coloré selon l'étiquette de chaque zone de merde
         if labelImg[y][x] == n:
            colorImg[y][x] = color[n-1]
sk.imsave('unko_color.png', colorImg)

Le résultat du recadrage et de l'enregistrement de chaque merde à partir des statistiques obtenues à partir de la fonction d'étiquetage

unko_img.003.png

Le résultat de l'étiquetage couleur de chaque zone de merde

unko_img.004.png

C'est pratique! Couvert de merde!

Rotation of Image

Résumé des fonctions qui font pivoter les images. Cette fois, je résumerai uniquement le cas de la rotation à partir du centre de l'image.

#angle de rotation(Sens antihoraire)
angle = 90

# Scipy
rotImg = ndi.interpolation.rotate(img, angle=angle)

# OpenCV
imsize = img.shape
rotMat = cv.getRotationMatrix2D(tuple(np.array(imsize)/2), angle, scale=1.0)
rotImg = cv.warpAffine(img, rotMat, imsize)

Il existe également une fonction qui retourne l'image.

flipCode = 0

# OpenCV
flipImg = cv.flip(img, flipCode=flipCode)

L'argument flipCode est un paramètre qui contrôle la direction du retournement.

Interpolation

Un résumé des fonctions qui exécutent l'interpolation d'image. Il existe des méthodes d'interpolation d'image Nearest, Bilinear, Bicubic, etc., et elles sont utilisées correctement en fonction de l'image et du but.

#Taille d'interpolation
ipsize = (200, 200)

# OpneCV
#Méthode d'interpolation
cv.INTER_NEAREST  # Nearest
cv.INTER_LINEAR   # Bilinear
cv.INTER_CUBIC    # Bicubic
ipImg = cv.resize(img, ipsize, metLinear)

# scikit-image
#Méthode d'interpolation(Biquintic etc. sont également disponibles)
order = 0  # Nearest
order = 1  # Bilinear (default)
order = 3  # Bicubic
#conserver si img est float_la plage doit être définie sur True
ipImg = tr.resize(img, ipsize, order = 3, preserve_range = True)

interpolation.001.jpeg

Extract Feature

Extrayez des fonctionnalités telles que les bords de l'image. En plus de SIFT, qui est un algorithme d'extraction de caractéristiques, l'extraction des bords à l'aide d'un filtre différentiel est également résumée dans cette section.

SIFT

SIFT (Scale-Invariant Feature Transform) est l'un des algorithmes d'extraction de caractéristiques les plus utilisés, et il extrait des caractéristiques robustes aux changements d'échelle et de position. Il est également utilisé principalement dans le domaine de la reconnaissance d'images en reconnaissance de formes et en apprentissage automatique.

Les fonctions fournies par OpenCV sont stockées dans le module contrib depuis la version 3.0, elles doivent donc être ajoutées à la variante lors de l'installation. Il existe une autre façon de le faire dans les versions jusqu'à 2.4, mais cette fois nous allons le résumer en supposant qu'il s'agit d'OpenCV 3.0 ou version ultérieure.

#Extraction de caractéristiques
det = cv.xfeatures2d.SIFT_create()
kp = det.detect(img)   #img est CV_8U(uint8)

#Ajouter à l'image
siftImg = cv.drawKeypoints(img, kp, None)

SURF

SURF (Speeded-Up Robust Features) est un algorithme qui augmente la vitesse de traitement au lieu de réduire le nombre de dimensions du vecteur qui représente la quantité de caractéristiques dans l'algorithme SIFT.

#Extraction de caractéristiques
det = cv.xfeatures2d.SURF_create()
kp = det.detect(img)   #img est CV_8U(uint8)

#Ajouter à l'image
surfImg = cv.drawKeypoints(img, kp, None)

siftandsurf.001.jpeg

Prewitt Filtering

Une technique de filtrage pour détecter le gradient de luminosité dans une image. Le concept du filtre Prewitt est que lors du calcul du gradient dans une certaine direction du noyau, le lissage est effectué dans cette direction et dans la direction horizontale, puis une différenciation est effectuée.

# SciPy
preImg = ndi.filters.prewitt(img)

Sobel Filtering

C'est presque le même filtre différentiel que le filtre Prewitt, sauf qu'il est pondéré au centre du noyau. Personnellement, le filtre Sobel a l'impression que les bords peuvent être enlevés proprement.

# SciPy
sobImg = ndi.filters.sobel(img)

presob.001.jpeg

Others

Downhill Filtering

L'algorithme utilisé pour la suppression d'arrière-plan (BG). Voir le papier original [1] pour le contenu.

# seed (Critères pour les valeurs considérées comme BG)Création
seed = copy.deepcopy(img)
seed[1:-1, 1:-1] = img.min()

dilatedImg = mor.reconstruction(seed, img, method='dilation')
dhImg = copy.deepcopy(img - dilated)

downhill.001.jpeg

Résumé

Quelle que soit la bibliothèque que vous utilisez dans le traitement d'image, il est dangereux de l'utiliser sans comprendre l'algorithme, donc je pense qu'il est important de coder de manière cohérente avec une bibliothèque familière qui connaît le contenu. De plus, comme mon analyse d'image cible principalement les images en niveaux de gris, je ne suis pas doué pour le traitement d'image dans les images RVB, et je n'ai pas été en mesure de le refléter beaucoup dans ce contenu. Dans le futur, j'aimerais apprendre le traitement d'image multicanal avec un œil sur les images RVB. Le contenu sera mis à jour de temps à autre.

Les références

[1] Robinson, Kevin, and Paul F. Whelan. "Efficient morphological reconstruction: a downhill filter." Pattern Recognition Letters 25.15 (2004): 1759-1767.

Recommended Posts

Collection de traitement d'image en Python
traitement d'image python
Traitement de fichiers en Python
Premier traitement d'image Python
Traitement de texte avec Python
Format d'image en Python
Traitement des requêtes en Python
Traitement d'image avec Python
Traitez facilement des images en Python avec Pillow
Traitement d'image avec Python (partie 2)
Traitement de texte UTF8 avec python
Traitement asynchrone (threading) en python
Traitement d'image avec Python (partie 1)
Tweet avec image en Python
Traitement d'image avec Python (3)
Traitement d'image par python (Pillow)
Utilisation du mode Python dans le traitement
[Python] Traitement d'image avec scicit-image
Traitement du signal en Python (1): transformée de Fourier
Opération de collecte de type Scala en Python
Notes personnelles pour le traitement d'images python
Traitement d'image avec la binarisation Python 100 knocks # 3
100 traitement d'image par Python Knock # 2 Échelle de gris
[Traitement d'image] Postérisation
Générer une collection de première classe en Python
Quadtree en Python --2
Bases du traitement d'images binarisées par Python
Traitement d'image par Python 100 knock # 10 filtre médian
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Traitement d'image par le remplacement du canal Python 100 Knock # 1
Méta-analyse en Python
Unittest en Python
100 traitement d'image avec Python Knock # 8 Max Pooling
Époque en Python
Discord en Python
Méthode de collecte d'images
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
Échelle de gris par matrice-Reinventor of Python image processing-
Traitement d'image avec Python et OpenCV [Tone Curve]
Traitement d'image par Python 100 knock # 12 motion filter
Traitement d'image par Python 100 Knock # 6 Traitement de réduction de couleur
Plink en Python
Constante en Python
FizzBuzz en Python
Comment régler le contraste de l'image en Python
Sqlite en Python
Étape AIC en Python
Dessin avec Matrix-Reinventor of Python Image Processing-
Programmation scientifique Collection Petit Tech en Python
LINE-Bot [0] en Python
Traitement d'image 100 coups ①