Permettez-moi de commencer ce tutoriel en enlevant du jargon théorique. Quand on parle de amélioration d'images, cela signifie fondamentalement que nous voulons une nouvelle version de l'image plus appropriée que celle d'origine.
Par exemple, lorsque vous numérisez un document, la qualité de l'image de sortie peut être inférieure à celle de l'image d'origine. Nous avons donc besoin d'un moyen d'améliorer la qualité des images de sortie afin qu'elles puissent être visuellement plus expressives pour le spectateur, et c'est là que l'amélioration d'images entre en jeu. Lorsque nous améliorons une image, nous renforçons les caractéristiques de l’image, telles que le contraste et les bords..
Il est important de noter que l'amélioration de l'image n'augmente pas le contenu en informations de l'image, mais augmente plutôt la plage dynamique des fonctionnalités choisies, augmentant ainsi la qualité de l'image. Donc ici, nous ne savons pas vraiment à quoi ressemblerait l'image de sortie, mais nous devrions pouvoir dire (subjectivement) s'il y a eu des améliorations ou non, comme l'observation de plus de détails dans l'image de sortie, par exemple..
L’amélioration d’image est généralement utilisée comme étape de prétraitement dans les étapes fondamentales du traitement d’image numérique (c’est-à-dire la segmentation, la représentation). Il existe de nombreuses techniques d'amélioration de l'image, mais je vais couvrir deux techniques dans ce tutoriel: image inverse et transformation de la loi de puissance. Nous verrons comment les implémenter en Python. Alors, commençons!
Comme vous l'avez peut-être deviné grâce au titre de cette section (que l'on peut également appeler négation d'image), image inverse vise à transformer les intensités sombres de l’image d’entrée en intensités lumineuses de l’image de sortie et les intensités lumineuses de l’image d’entrée aux intensités sombres de l’image de sortie. En d'autres termes, les zones sombres deviennent plus claires et les zones claires deviennent plus sombres.
Dis ça Je (i, j)
se réfère à la valeur d'intensité du pixel situé à (i, j)
. Pour préciser un peu ici, les valeurs d'intensité dans l'image en niveaux de gris se situent dans la plage [0,255]
, et (i, j)
fait référence aux valeurs de ligne et de colonne, respectivement. Lorsque nous appliquons l’opérateur inverse d’image sur une image en niveaux de gris, le pixel de sortie O (i, j)
la valeur sera:
O (i, j) = 255 - I (i, j)
De nos jours, la plupart de nos images sont en couleur. Ces images contiennent trois canaux, rouge, vert, et bleu, dénommé RVB
images. Dans ce cas, contrairement à la formule ci-dessus, nous devons soustraire l’intensité de chaque canal de 255. Ainsi, l'image de sortie aura les valeurs suivantes au pixel (i, j)
:
O_R (i, j) = 255 - R (i, j) O_G (i, j) = 255 - G (i, j) O-B) i, j) = 255 - B (i, j)
Après cette introduction, voyons comment implémenter l’opérateur inverse d’image en Python. Je voudrais mentionner que par souci de simplicité, je vais exécuter l'opérateur sur une image en niveaux de gris. Mais je vais vous donner quelques réflexions sur l'application de l'opérateur sur une image en couleur, et je vous laisserai le programme complet à titre d'exercice..
La première chose à faire pour une image couleur est d’extraire chaque valeur d’intensité de canal de pixel (c'est-à-dire RVB). À cette fin, vous pouvez utiliser la bibliothèque d’image (PIL). Allez-y et téléchargez un exemple d'image de babouin à partir de baboon.png. La taille de l'image est 500x500
. Supposons que vous souhaitiez extraire les valeurs d'intensité rouge, verte et bleue situées à l'emplacement du pixel. (325, 432)
. Cela peut être fait comme suit:
à partir de PIL import Image im = Image.open ('baboon.png') print im.getpixel ((325,432))
Basé sur la documentation, quelle est la méthode getpixel ()
fait est:
Renvoie la valeur du pixel à une position donnée.
Après avoir exécuté le script ci-dessus, vous remarquerez que vous n'obtenez que le résultat suivant: 138
! Mais où sont les valeurs d'intensité des trois canaux (RVB)? Le problème semble être avec le mode
de l'image en cours de lecture. Vérifiez le mode en exécutant l'instruction suivante:
imprimer im.mode
Vous obtiendrez la sortie P
, ce qui signifie que l'image a été lue en mode palette. Vous pouvez notamment convertir l’image en mode RVB avant de renvoyer les valeurs d’intensité des différents canaux. Pour ce faire, vous pouvez utiliser le convertir()
méthode, comme suit:
rgb_im = im.convert ('RGB')
Dans ce cas, vous obtiendrez la valeur suivante: (180, 168, 178)
. Cela signifie que les valeurs d'intensité pour les canaux rouge, vert et bleu sont 180, 168 et 178, respectivement..
Pour résumer tout ce que nous avons décrit jusqu'à présent, le script Python qui renverrait les valeurs RVB d'une image se présente comme suit:
from PIL import Image im = Image.open ('baboon.png') rgb_im = im.convert ('RGB') print rgb_im.getpixel ((325,432))
Il reste un point avant de passer à l'opérateur inverse d'image. L'exemple ci-dessus montre comment récupérer la valeur RVB de un pixel uniquement, mais lors de l'exécution de l'opérateur inverse, vous devez l'exécuter sur tout les pixels.
Pour imprimer toutes les valeurs d'intensité des différents canaux de chaque pixel, vous pouvez procéder comme suit:
from PIL import Image im = Image.open ('baboon.png') rgb_im = im.convert ('RGB') largeur, hauteur = im.size pour w dans la plage (largeur): pour h dans la plage (hauteur): imprimer rgb_im.getpixel ((w, h))
À ce stade, je vous laisse le soin de comprendre comment appliquer l'opérateur inverse d'image sur tous les canaux d'image couleur (c'est-à-dire RVB) de chaque pixel..
Voyons un exemple qui applique l'opérateur inverse d'image sur une image en niveaux de gris. Allez-y et téléchargez boat.tiff, qui servira d’image de test dans cette section. Voici à quoi ça ressemble:
Je vais utiliser le scipy
bibliothèque pour cette tâche. Le script Python permettant d’appliquer l’opérateur inverse de l’image sur l’image ci-dessus doit se présenter comme suit:
importer scipy.misc depuis scipy importer misc depuis scipy.misc.pilutil importer Image im = Image.open ('boat.tiff') im_array = scipy.misc.fromimage (im) im_inverse = 255 - im_array im_result = scipy.misc.toimage (im_inverse) misc.imsave ('result.tiff', im_result)
La première chose que nous avons faite après avoir lu l’image est de la convertir en ndarray afin d’appliquer l’opérateur inverse de l’image. Après avoir appliqué l’opérateur, nous reconvertissons simplement le ndarray en une image et enregistrons cette image sous le nom suivant: résultat.tiff
. La figure ci-dessous affiche le résultat de l'application de l'image inverse à l'image ci-dessus (l'image d'origine est à gauche et le résultat de l'application de l'image inverse est à droite):
Notez que certaines caractéristiques de l'image sont devenues plus claires après l'application de l'opérateur. Regardez, par exemple, les nuages et le phare à la bonne image.
Cet opérateur, également appelé correction gamma, est un autre opérateur que nous pouvons utiliser pour améliorer une image. Voyons l'équation de l'opérateur. Au pixel (i, j)
, l'opérateur se présente comme suit:
p (i, j) = kI (i, j) ^ gamma
Je (i, j)
est la valeur d'intensité à l'emplacement de l'image (i, j)
; et k
et gamma
sont des constantes positives. Je n’entrerai pas dans les détails mathématiques, mais je pense que vous pouvez trouver des explications détaillées sur ce sujet dans les livres de traitement d’images. Cependant, il est important de noter que dans la plupart des cas, k = 1
, Nous allons donc principalement changer la valeur du gamma. L'équation ci-dessus peut donc être réduite à:
p (i, j) = I (i, j) gamma
Je vais utiliser le OpenCV
et NumPy
bibliothèques ici. Vous pouvez consulter mon tutoriel suivant: Introduction à NumPy si vous souhaitez en savoir plus sur la bibliothèque. Notre image de test sera à nouveau boat.tiff (allez-y et téléchargez-la).
Le script Python permettant d’opérer l’opérateur de transformation de la loi de puissance se présente comme suit:
importer cv2 importer numpy comme np im = cv2.imread ('boat.tiff') im = im / 255.0 im_power_law_transformation = cv2.pow (im, 0.6) cv2.imshow ('Image originale', im) cv2.imshow ('Power Transformation de loi ', im_power_law_transformation) cv2.waitKey (0)
Notez que la valeur gamma que nous avons choisie est 0.6
. La figure ci-dessous montre l'image d'origine et le résultat de l'application de l'opérateur de transformation de loi de puissance sur cette image (l'image de gauche montre l'image d'origine et l'image de droite montre le résultat après application de l'opérateur de transformation de loi de puissance)..
Le résultat ci-dessus était quand gamma = 0,6
. Voyons ce qui se passe quand on augmente le gamma à 1,5
, par exemple:
Notez que lorsque nous augmentons la valeur du gamma, l’image s’assombrit et inversement..
On pourrait se demander quelle pourrait être l’utilisation de la transformation de la loi du pouvoir. En fait, les différents dispositifs utilisés pour l'acquisition, l'impression et l'affichage d'images répondent en fonction de l'opérateur de transformation de la loi de puissance. Cela est dû au fait que le cerveau humain utilise la correction gamma pour traiter une image. Par exemple, la correction gamma est considérée comme importante lorsque nous voulons qu'une image soit affichée correctement (le meilleur contraste d'image est affiché dans toutes les images) sur un écran d'ordinateur ou un écran de télévision..
Dans ce tutoriel, vous avez appris à améliorer des images à l'aide de Python. Vous avez vu comment mettre en évidence des fonctionnalités à l'aide de l'opérateur inverse d'image et comment la transformation de la loi de puissance est considérée comme un opérateur essentiel pour l'affichage correct des images sur des écrans d'ordinateur et de télévision..
De plus, n'hésitez pas à voir ce que nous avons disponible à la vente et à étudier dans le marché Envato, et s'il vous plaît posez des questions et fournissez vos précieux commentaires en utilisant le flux ci-dessous.