Une segmentation de l'image décrite à l'aide du module de python scikit image

Lei Feng réseau AI Technology Review Press, avec la technologie de l'intelligence artificielle de chaque année de feu, plus en plus de gens dans la recherche dans le domaine de la vision par ordinateur. Et la segmentation d'image est une étape très importante dans le traitement de l'image, l'image qui est divisée en plusieurs régions spécifique avec des propriétés uniques, et extrait l'objet d'art d'intérêt.

Récemment, les ingénieurs Parul Pandey a publié un billet de blog sur le blog, elle décrit une méthode de segmentation d'images en utilisant la bibliothèque scikit-image de python. En particulier, à l'installation, et par l'introduction d'une image sans surveillance et algorithmes supervisés algorithme scikit-image de la méthode de segmentation d'image. Lei Feng réseau compilé AI Technology Review résume comme suit.

Tôt ou tard, tout est numérique, y compris les images.

Lire le « Terminator » qui doit penser que c'est l'époque des plus grands films de science-fiction. Dans ce film, James Cameron a introduit le concept d'un effet visuel intéressant, il peut donner au public une possible cache derrière le cyborg est appelé les yeux du Terminator. Cet effet est appelé « Terminator vision », en quelque sorte, ce sera les gens avec un fond séparé. À l'époque, il semble tout à fait un fantasme, mais maintenant, la segmentation d'image est devenue un élément important de nombreuses technologies de traitement d'image.

La segmentation d'images

Nous savons tous, Photoshop ou un éditeur graphique similaire offre de possibilités illimitées, une personne peut être amenés d'une autre image dans une image. Cependant, pour ce faire, vous devez d'abord déterminer la position de cette personne dans l'image source, qui ont besoin d'utiliser la technologie de segmentation d'images. Il existe de nombreuses bibliothèques pour l'analyse d'images et d'écriture. Dans cet article, nous allons discuter de la scikit image bibliothèque de traitement d'image à base de python en détail.

Le code complet est également accessible à partir du dépôt Github associé à ce document.

Scikit image

SciKit python image est un traitement d'image dédié paquet.

installer

Scikit image peut être installé comme suit:

pip installer -U scikit image (Linux et OSX)

pip installer scikit image (Windows)

# Pour les distributions basées sur Conda

Conda installer scikit image

Vue d'ensemble du python de traitement d'image

Avant d'utiliser, il faut des techniques de segmentation d'image d'abord comprendre l'image scikit et comment il est en train de traiter une image.

L'introduction d'une image en niveaux de gris à partir d'une bibliothèque skimage

module de données skimage contient un des ensembles de données intégrés échantillon, les ensembles de données sont généralement stockées dans un format JPEG ou PNG.

à partir des données d'importation skimage

importer numpy comme np

matplotlib.pyplot importation comme plt

Image = data.binary_blobs

plt.imshow (image, cmap = 'gris')

images couleur importation de la bibliothèque skimage

à partir des données d'importation skimage

importer numpy comme np

matplotlib.pyplot importation comme plt

image = data.astronaut

plt.imshow (image)

Importer des images à partir d'une source externe

# Le module E / S est utilisé pour importer l'image

à partir des données d'importation skimage

importer numpy comme np

matplotlib.pyplot importation comme plt

de io import skimage

io.imread image = ( 'skimage_logo.png')

plt.imshow (image);

Charger plus d'images

images = io.ImageCollection ( '../ images / * .png :. ../ images / jpg *.)

print ( 'Type:', tapez (images))

images.files

Out: Type:

Enregistrer l'image

fichier #Saving comme « logo.png »

io.imsave ( 'logo.png', logo)

La segmentation d'images

Maintenant que nous comprenons la scikit image, nous allons prendre une segmentation d'image plus proche. Essentiellement, l'image numérique en une pluralité de segments du processus de segmentation d'image, ou de simplifier le changement de représentation de l'image est l'analyse du contenu plus facile et plus significative.

Dans cet article, nous combinons des algorithmes supervisés et non supervisés algorithme pour traiter processus de segmentation.

Certaines bibliothèque d'algorithmes de segmentation scikit-image disponible

algorithme de segmentation supervisée : Une certaine connaissance préalable de l'intervention humaine peut être utilisé pour guider l'algorithme.

algorithme de segmentation non supervisée : Aucune connaissance préalable. Ces algorithmes tentent de cassé automatiquement dans une région d'image significative. Les utilisateurs peuvent toujours modifier certains paramètres pour obtenir la sortie désirée.

Soit l'algorithme de segmentation du plus simple seuil commencer.

Algorithme Seuil

En sélectionnant le pixel au-dessus ou au-dessous d'un certain seuil, à partir de l'objet segmenté de l'arrière-plan est la méthode la plus simple. Dans la segmentation de Beijing, ce qui est généralement un moyen très utile. En savoir plus consulter: http: //scikit-image.org/docs/dev/auto_examples/xx_applications/plot_thresholding.html

Essayons sur une image manuel ensemble de données scikit-image.

entrée de base

importer numpy comme np

matplotlib.pyplot importation comme plt

skimage.data d'importation des données

skimage.segmentation d'importation comme seg

skimage.filters à l'importation des filtres

importation skimage.draw comme tirage

skimage.color importation que la couleur

Dessiner une fonction simple, de l'image:

def image_show (image, nrows = 1, ncols = 1, cmap = 'grise'):

fig, Ax = plt.subplots (nrows = nrows, ncols = ncols, figsize = (14, 14))

ax.imshow (image, cmap = 'gris')

ax.axis ( 'off')

retour fig, hache

image

text = data.page

image_show (texte)

Cette image est un peu sombre, mais nous pouvons toujours choisir une valeur, il peut être raisonnablement divisé des images sans qu'il soit nécessaire d'utiliser des algorithmes avancés. Pour obtenir ce seuil de segmentation, nous utiliserons l'histogramme.

Un histogramme est un nombre de pixels dans l'image de différentes FIG valeurs d'intensité d'affichage. En bref, l'histogramme est un graphique dans lequel l'axe X montre-les valeurs de tous les pixels dans l'image, les valeurs de fréquence de l'affichage de l'axe Y.

fig, Ax = plt.subplots (1, 1)

ax.hist (text.ravel, bacs = 32, gamme = )

ax.set_xlim (0, 256);

Notre exemple se trouve être une des images 8 bits, un total de 256 valeurs possibles sur l'axe X. Dans l'image, 0 représente le noir et le blanc représente 255, nous avons observé que certaines des valeurs de pixel sont définies. Ceci est probablement dû à notre base de texte relativement court, alors que l'autre partie est un peu floue. Un histogramme de segmentation idéale doit avoir deux pics, et les sommets à travers les deux loin, afin que nous puissions sélectionner le numéro de sélection en tant que valeur de seuil au milieu de ces deux sommets. Maintenant, nous allons essayer de diviser l'image selon une méthode simple de seuil.

seuil sous surveillance

Parce que le seuil de notre choix, donc nous appelons seuil de supervision.

text_segmented = text >  (Valeur de l'histogramme conclu i.e. 50,70,120)

image_show (text_segmented);

texte > 50

texte > 70

texte > 120

Nous n'avons pas obtenu les résultats escomptés, car l'ombre à gauche causera des problèmes, ESSAYONS seuil sans supervision.

seuil Unsupervised

Beaucoup méthode de réglage automatique de seuil scikit image, ne nécessite pas de saisie manuelle lors de la sélection du seuil optimal. Les méthodes couramment laquelle utilisées Otsu, li, comme local.

text_threshold = filters.threshold_ # onglet Hit avec le curseur après le trait de soulignement pour obtenir toutes les méthodes.

image_show (texte

la segmentation figure algorithme Otsu

algorithme de segmentation de la figure li.

Dans l'algorithme local, nous avons également besoin de préciser la taille du bloc. décalage permet d'ajuster l'image pour obtenir de meilleurs résultats.

text_threshold = filters.threshold_local (texte, block_size = 51, décalage = 10)

image_show (texte >  text_threshold);

Les effets de seuil de la figure locale divisée.

Ceci est une bonne méthode, ce qui élimine le bruit dans une large mesure.

Division de la surveillance

Est seuillage une méthode de segmentation très basique, mais il est pas très bon dans les images à contraste élevé, donc nous avons besoin d'utiliser des algorithmes plus avancés.

Dans cette section, nous allons utiliser une image de l'échantillon gratuit et essayer de diriger la segmentation d'images humaine en utilisant des techniques de segmentation non supervisées.

# Importer l'image

de io import skimage

io.imread image = ( 'girl.jpg')

plt.imshow (image);

Image Source

Petit conseil: avant toute segmentation d'image, en utilisant de préférence une partie de son filtre de débruitage.

Cependant, dans notre exemple, le bruit dans l'image est petit, nous les avons traités directement. Ensuite, nous allons faire est d'utiliser rgb2gray pour convertir l'image en niveaux de gris.

image_gray = color.rgb2gray (image)

image_show (image_gray);

Nous utiliserons deux principe complètement différent de la segmentation.

la segmentation du contour actif (segmentation du contour actif)

la segmentation du contour actif ou les lignes de contour défini par l'utilisateur autour de la zone d'intérêt est initialisé, et ensuite le contour rétrécit lentement.

Pour notre exemple, l'image, donc nous nous concentrons sur la tête d'une personne pour dessiner un cercle pour initialiser le profil.

def circle_points (résolution, centre, rayon):

« » « Générer des points qui définissent un cercle sur un image.Centre fait référence au centre du cercle » « »

radians = np.linspace (0, 2 * np.pi, résolution)

c = center + * np.cos rayon (radians) coordonnées #polar

r = center + * np.sin rayon (radians)

retour np.array ( ) .T

# Exclure dernier point parce qu'un chemin fermé ne doit pas avoir des points en double

points = circle_points (200, , 80)

Les coordonnées x et y faisant face des points de bord annulaires sont calculées. Nous avons fixé la valeur de résolution est de 200, le 200 calculé ces points.

fig, ax = image_show (image)

ax.plot (points , les points , '-R', lw = 3)

Ensuite, l'algorithme d'ajustement de courbe sur le bord de la face de fermeture, et le reste de l'image de visage est séparé.

serpent = seg.active_contour (image_gray, points)

fig, ax = image_show (image)

ax.plot (points , les points , '-R', lw = 3)

ax.plot (serpent , serpent , '-b', lw = 3);

Nous pouvons ajuster l'alpha et bêta paramètres. Plus la valeur alpha, le profil plus rapide, la vitesse de retrait, et plus la bêta de retrait lent.

serpent = seg.active_contour (image_gray, des points, alpha = 0,06, bêta = 0,3)

fig, ax = image_show (image)

ax.plot (points , les points , '-R', lw = 3)

ax.plot (serpent , serpent , '-b', lw = 3);

segmentation aléatoire Walker

Dans cette méthode, l'utilisateur marqué de manière interactive petit nombre de pixels, les pixels appelés une balise. Chaque pixel est ensuite supposé qu'un marcheur aléatoire libération non marqué, et ensuite de déterminer une probabilité que le marcheur aléatoire atteint le pixel marqué pré-démarrage provenant de chaque pixel non marqués. Une probabilité attribuée à chaque pixel par la valeur d'étiquette calculée est maximale, la qualité de l'image divisée peut être obtenue.

Plus d'informations peuvent être lues Références: https: //ieeexplore.ieee.org/document/1704833.

Nous allons réutiliser la valeur de départ dans l'exemple précédent ici. Par souci de simplicité, nous continuons d'utiliser le cercle.

image_labels = np.zeros (image_gray.shape, DTYPE = np.uint8)

Au hasard Walker algorithme nécessite en entrée une image d'étiquette. Nous aurons donc un plus grand cercle qui entourait l'ensemble du visage de l'homme, il y a un petit tour près du milieu du visage.

indices = draw.circle_perimeter (80, 250,20) #from ici

image_labels  = 1

image_labels = 2

image_show (image_labels);

Maintenant, nous allons utiliser le promeneur au hasard, et voir ce qui se passe.

image_segmented = seg.random_walker (image_gray, image_labels)

# Vérifiez nos résultats

fig, ax = image_show (image_gray)

ax.imshow (image_segmented == 1, alpha = 0,3);

Il ne décrit pas les bords de la face que nous nous attendions. Pour résoudre ce problème, nous pouvons régler les paramètres bêta jusqu'à ce que vous obtenez le résultat souhaité. Après plusieurs tentatives, il peut être obtenu, lorsque la valeur bêta est 3000, divisé de bons résultats.

image_segmented = seg.random_walker (image_gray, image_labels, bêta = 3000)

# Vérifiez nos résultats

fig, ax = image_show (image_gray)

ax.imshow (image_segmented == 1, alpha = 0,3);

Ceux-ci sont la segmentation supervisée, dans cet algorithme, nous devons fournir une entrée, vous devez également régler certains paramètres. Cependant, nous ne pouvons pas toujours les gens regardent une image, puis décider entrée ou où commencer. Heureusement, dans ce cas, on peut utiliser des techniques de segmentation non supervisées.

segmentation non supervisée

segmentation non supervisée ne nécessite pas de connaissance préalable de l'image. Dans la photo suivante est trop grande, compte tenu de tous les pixels n'est pas possible. Par conséquent, dans ce cas, la segmentation non supervisée d'images peut être décomposé en plusieurs sous-zones, vous pouvez utiliser des dizaines à des centaines de régions au lieu du nombre de mégapixels. Voici deux algorithme de segmentation non supervisée:

SLIC (linéaire simple classification itératif)

algorithme SLIC utilise en fait algorithme d'apprentissage automatique appelé les k-means. Il reçoit toutes les valeurs de pixel de l'image, et tente de les séparer à un certain nombre de sous-régions.

Plus de détails peuvent lire les informations pertinentes: https: //ieeexplore.ieee.org/document/6205760.

SLIC est une image couleur, donc nous allons utiliser l'image originale.

image_slic = seg.slic (image, n_segments = 155)

Ce que nous avons fait était chaque sous-image ou sous-zone du pixel d'image est réglée pour la moyenne de la zone de pixels.

# Label2rgb remplace chaque étiquette discrète à la couleur intérieure moyenne

image_show (color.label2rgb (image_slic, image, type = 'moyen'));

Nous avons cette image réduite de 512 * 512 = 262000 pixels en 155 régions.

algorithme Felzenszwalb

L'algorithme utilise également un algorithme d'apprentissage automatique, couvrant minimal algorithme de classification des arbres. algorithme Felzenszwaib ne nous dit pas combien d'images seront divisés en groupes. Il fonctionnera et générer autant pour son cluster. documents de référence connexes peuvent être trouvés ici.

image_felzenszwalb = seg.felzenszwalb (image)

image_show (image_felzenszwalb);

Il y a beaucoup de domaines, nous avons calculé le nombre de régions indépendantes les unes des autres.

np.unique (image_felzenszwalb) .Size

3368

Maintenant, nous allons utiliser la valeur moyenne de la zone de pixels pour les recolorer, comme nous l'avons fait dans l'algorithme SLIC.

image_felzenszwalb_colored = color.label2rgb (image_felzenszwalb, image, type = 'moyen')

image_show (image_felzenszwalb_colored);

Maintenant, nous divisons l'image dans une zone convenablement petite. Si nous voulons que l'image dans des zones plus petites, vous pouvez modifier les paramètres d'échelle, ou de continuer à les combiner. Cette méthode est parfois appelée sur-segmentation.

Il ressemble plus à une image divisée, ce qui réduit essentiellement que le nombre de couleurs. Pour re-combinaison de ceux-ci, peuvent être utilisés Région contiguïté Graphique (RAG), mais cela dépasse le cadre de cet article.

conclusion

La segmentation d'images est une étape très importante dans le traitement d'image. Il est une zone chaude de la recherche, est largement utilisé, de la vision par ordinateur à des images médicales, de la surveillance du trafic et de la vidéo et d'autres domaines sont impliqués. Python scikit image fournit une bibliothèque très puissant qui a un grand nombre d'algorithmes de traitement d'image. Il est gratuit, sans aucune limitation, il y a une communauté active derrière elle. Vous pouvez vérifier leur documentation pour plus d'informations sur la bibliothèque et ses cas d'utilisation.

via: https: //towardsdatascience.com/image-segmentation-using-pythons-scikit-image-module-533a61ecc980

Lei Feng réseau compilé AI Technology Review.

Nouvelles lente · Personnes | quatre académiciens Lorsque l'examinateur, a remporté l'identification nationale des réalisations scientifiques et technologiques! Il a étudié les choses que le système
Précédent
série de vacances Stüssy publié! Casual Fan Stüssy encore plein de sens de la mode!
Prochain
A propos de 200000 voitures de taille moyenne, sur un certain nombre de ces paragraphes assis plus confortable!
Nick Aaron Kwok Sammi Cheng Zhang Guoli boîte équivalente, Media Asia Films ont un grand mouvement!
Les taux de rétention peuvent augmenter vos sacs! X BAPE PORTER 2017 nouveaux sacs en commun
routeur X5 de pissenlit pour vous aider à obtenir facilement entreprise de surveillance vidéo à distance
Voir | Venez ici rencontrer des fleurs « d'acres Taolin » pour les médias, au printemps comme une occasion
Tu dors encore? Pas aussi bon que cela vous donne une sorte de sommeil il!
Travailler trop, et aux heures supplémentaires de travail? matériel de bureau efficace pour vous sauver
« Gang noir »: comment riez-vous, comment pleurer vous laisser
Cloud Technology et Université Jiaotong de Shanghai AAAI de documents sélectionnés lire: annotation rôle sémantique de nouvelles idées
Chic télétravail, routeur d'entreprise peut aussi être très Skr
équipe « Tongue » poussé nouveau travail, la lecture donne immédiatement à perdre du poids!
Momoyama Forêt « tour Lin Tour » tour du monde coloré