Maison >développement back-end >Tutoriel Python >Technologie d'amélioration d'image basée sur Python
Permettez-moi de commencer ce tutoriel avec quelques termes théoriques. Lorsque nous parlons de Amélioration de l'image, cela signifie essentiellement que nous voulons une nouvelle version de l'image plus adaptée que l'image originale.
Par exemple, lorsque vous numérisez un document, la qualité de l'image de sortie peut être inférieure à celle de l'image d'entrée d'origine. Par conséquent, nous avons besoin d’un moyen d’améliorer la qualité des images de sortie afin qu’elles soient visuellement plus expressives pour le spectateur, et c’est là que l’amélioration de l’image entre en jeu. Lorsque nous améliorons une image, nous accentuons les caractéristiques de l’image, telles que le contraste et les bords.
Il convient de noter que l'amélioration de l'image n'augmente pas le contenu informatif de l'image, mais augmente la plage dynamique des caractéristiques sélectionnées, améliorant finalement la qualité de l'image. Ici, nous ne savons pas réellement à quoi ressemblera l'image de sortie, mais nous devrions être capables de dire (subjectivement) s'il y a des améliorations, comme l'observation de plus de détails dans l'image de sortie.
L'amélioration de l'image est souvent utilisée comme étape de prétraitement parmi les étapes de base impliquées dans le traitement de l'image numérique (c'est-à-dire la segmentation, la représentation). Il existe de nombreuses techniques d'amélioration d'image, mais j'en aborderai deux dans ce tutoriel : Image Inverse et Power Law Transformation. Nous verrons comment les implémenter en Python. Commençons !
Comme vous l'avez peut-être deviné d'après le titre de cette section (qui peut également être appelée inversion d'image), le but de l'inversion d'image est de convertir l'intensité sombre de l'image d'entrée en intensité lumineuse de l'image. image de sortie et l'intensité lumineuse dans l'image d'entrée à l'intensité sombre dans l'image de sortie. En d’autres termes, les zones sombres deviennent plus claires et les zones claires deviennent plus sombres.
Supposons que la valeur de I(i,j)
指的是位于 (i,j)
处的像素的强度值。这里澄清一下,灰度图像中的强度值落在 [0,255]
范围内,而 (i,j)
指的是行和列值, 分别。当我们对灰度图像应用图像逆运算符时,输出像素 O(i,j)
est :
O(i,j) = 255 - I(i,j)
Maintenant, la plupart de nos images sont en couleur. Ces images contiennent trois canaux : rouge, vert et bleu, et sont appelées images RVB
. Dans ce cas, contrairement à la formule ci-dessus, nous devons soustraire l'intensité de chaque RGB
图像。在这种情况下,与上面的公式相反,我们需要从 255 中减去每个通道的强度。因此输出图像在像素 (i ,j)
canal de 255. Par conséquent, l'image de sortie est en pixels (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 l'introduction, voyons comment implémenter l'opérateur inverse d'image en Python. Je tiens à mentionner que par souci de simplicité, j'exécuterai cet opérateur sur une image en niveaux de gris. Mais je vais vous donner quelques idées pour appliquer cet opérateur sur des images couleur, et je vous laisse le programme complet à titre d'exercice.
Pour les images couleur, la première chose que vous devez faire est d'extraire la valeur d'intensité de chaque canal de pixel (c'est-à-dire RVB). Pour ce faire, vous pouvez utiliser la Python Imaging Library (PIL). Continuez à télécharger l’exemple d’image de babouin à partir de baboon.png. La taille de l'image correspond aux valeurs d'intensité du rouge, du vert et du bleu en 500x500
。假设您要提取位于像素位置 (325, 432)
. Cela peut être fait comme suit :
from PIL import Image im = Image.open('baboon.png') print(im.getpixel((325,432)))
D'après la documentation, la méthode getpixel()
fait :
Renvoie la valeur du pixel à l'emplacement donné.
Après avoir exécuté le script ci-dessus, vous constaterez que vous obtenez uniquement les résultats suivants : 138
!但是三个通道的 (RGB) 强度值在哪里?问题似乎与正在读取的图像的 mode
À propos. Vérifiez le modèle en exécutant l'instruction suivante :
print(im.mode)
Vous obtiendrez le résultat de la méthode P
,这意味着图像是在调色板模式下读取的。您可以做的一件事是在返回不同通道的强度值之前将图像转换为 RGB 模式。为此,您可以使用 convert()
comme ceci :
rgb_im = im.convert('RGB')
Dans ce cas, vous obtiendrez la valeur de retour suivante : (180, 168, 178)
. Cela signifie que les valeurs d'intensité pour les canaux rouge, vert et bleu sont respectivement de 180, 168 et 178.
En rassemblant tout ce que nous avons décrit jusqu'à présent, un script Python qui renvoie les valeurs RVB d'une image ressemble à ceci :
from PIL import Image im = Image.open('baboon.png') rgb_im = im.convert('RGB') print(rgb_im.getpixel((325,432)))
Encore 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 seul pixel, mais lorsque vous effectuez l'opérateur inverse, vous devez le faire pour tous les pixels.
Pour imprimer toutes les valeurs d'intensité des différents canaux pour chaque pixel, vous pouvez procéder comme suit :
from PIL import Image im = Image.open('baboon.png') rgb_im = im.convert('RGB') width, height = im.size for w in range(width): for h in range(height): print(rgb_im.getpixel((w,h)))
À ce stade, je vais laisser cela comme un exercice pour que vous voyiez comment appliquer l'opérateur inverse d'image sur tous les canaux d'image couleur (c'est-à-dire RVB) pour chaque pixel.
Voyons un exemple d'application de l'opérateur inverse d'image sur une image en niveaux de gris. Allez-y et téléchargez boat.png, qui nous servira d’image de test dans cette section. Cela ressemble à ceci :
我将使用 numpy 库来完成此任务。在上面的图像上应用图像逆运算符的 Python 脚本应如下所示:
import cv2 import numpy as np from PIL import Image img = Image.open('boat.png') array_img = np.array(img) image_invert = np.invert(array_img) cv2.imwrite('new_boat.jpg', image_invert)
Numpy 是一个用于使用 Python 进行科学计算的 Python 包。 OpenCV-Python 是一个旨在解决计算机视觉问题的库。 OpenCV-Python 与 numpy 捆绑在一起,因此如果先安装 OpenCV-Python,则无需安装 numpy。我们首先用 Pillow 打开图像,然后将其转换为 numpy 数组。
然后我们使用numpy的invert()
函数将图像反转并保存新的反转图像。 invert()
函数会将白色转换为黑色,反之亦然。
下面左边是原始图像,右边是新反转的图像。
请注意,应用该运算符后,图像的某些特征变得更加清晰。例如,看看右侧图像中的云彩和灯塔。
这个算子,也称为伽马校正,是我们可以用来增强图像的另一个算子。让我们看看算子方程。在像素 (i,j)
处,运算符如下所示:
p(i,j) = kI(i,j)^gamma
I(i,j)
是图像位置处的强度值 (i,j)
; k
和 gamma
是正常数。我不会在这里讨论数学细节,但我相信您可以在图像处理书籍中找到该主题的详尽解释。但需要注意的是,在大多数情况下,k=1
,所以我们主要是改变gamma的值。因此,上述方程可以简化为:
p(i,j) = I(i,j)^gamma
我将在这里使用 OpenCV
和 NumPy
库。如果您需要了解有关该库的更多信息,请查看我的教程 NumPy 简介。我们的测试图像将再次是boat.tiff(继续下载它)。
执行幂律变换运算符的 Python 脚本如下所示:
import cv2 import numpy as np im = cv2.imread('boat.tiff') im = im/255.0 im_power_law_transformation = cv2.pow(im,0.6) cv2.imshow('Original Image',im) cv2.imshow('Power Law Transformation',im_power_law_transformation) cv2.waitKey(0)
请注意,我们选择的 gamma 值是 0.6
。下图显示了原始图像以及对该图像应用幂律变换算子的结果(左图为原始图像,右图为应用幂律变换算子后的结果)。
上面的结果是 gamma = 0.6
时的结果。让我们看看当我们将 gamma 增加到 1.5
时会发生什么,例如:
请注意,当我们增加伽马值时,图像会变得更暗,反之亦然。
您可能会问幂律变换有什么用处。事实上,用于图像采集、打印和显示的不同设备根据幂律变换算子进行响应。这是因为人脑使用伽马校正来处理图像。例如,当我们希望在计算机显示器或电视屏幕上正确显示图像(所有图像中显示最佳图像对比度)时,伽马校正就被认为很重要。
在本教程中,您学习了如何使用 Python 增强图像。您已经了解了如何使用图像逆算子突出显示特征,以及如何将幂律变换视为在计算机显示器和电视屏幕上正确显示图像的关键算子。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!