Heim  >  Artikel  >  Backend-Entwicklung  >  Python-basierte Bildverbesserungstechnologie

Python-basierte Bildverbesserungstechnologie

王林
王林Original
2023-08-30 22:05:101145Durchsuche

Lassen Sie mich dieses Tutorial mit einigen theoretischen Begriffen beginnen. Wenn wir über „Bildverbesserung“ sprechen, bedeutet das im Grunde, dass wir eine neue Version des Bildes wollen, die besser geeignet ist als das Originalbild. Wenn Sie beispielsweise ein Dokument scannen, ist die Qualität des Ausgabebilds möglicherweise schlechter als die des ursprünglichen Eingabebilds. Deshalb brauchen wir eine Möglichkeit, die Qualität der ausgegebenen Bilder zu verbessern, damit sie für den Betrachter visuell ausdrucksvoller sind, und hier kommt die Bildverbesserung ins Spiel. Wenn wir ein Bild verbessern, schärfen wir Bildmerkmale wie Kontrast und Kanten.

Es ist zu beachten, dass die Bildverbesserung nicht den Informationsgehalt des Bildes erhöht, sondern den Dynamikbereich der ausgewählten Merkmale erhöht und letztendlich die Qualität des Bildes verbessert. Hier wissen wir also nicht wirklich, wie das Ausgabebild aussehen wird, aber wir sollten (subjektiv) sagen können, ob es Verbesserungen gibt, wie zum Beispiel die Beobachtung weiterer Details im Ausgabebild.

Bildverbesserung wird häufig als Vorverarbeitungsschritt unter den Grundschritten der digitalen Bildverarbeitung (z. B. Segmentierung, Darstellung) verwendet. Es gibt viele Techniken zur Bildverbesserung, aber ich werde in diesem Tutorial zwei behandeln:

Image Inverse

und Power Law Transformation. Wir werden uns ansehen, wie man sie in Python implementiert. Fangen wir an! Bildumkehr

Wie Sie vielleicht anhand des Titels dieses Abschnitts (der auch als Bildinvertierung bezeichnet werden kann) erraten haben, besteht der Zweck der Bildinvertierung darin, die Dunkelintensität im Eingabebild in die Lichtintensität im Bild umzuwandeln. Ausgabebild und die helle Intensität im Eingabebild zur dunklen Intensität im Ausgabebild. Mit anderen Worten: Dunkle Bereiche werden heller und helle Bereiche dunkler.

Angenommen, der Wert von

ist:

O(i,j) = 255 - I(i,j)
I(i,j) 指的是位于 (i,j) 处的像素的强度值。这里澄清一下,灰度图像中的强度值落在 [0,255] 范围内,而 (i,j) 指的是行和列值, 分别。当我们对灰度图像应用图像逆运算符时,输出像素 O(i,j)Jetzt sind die meisten unserer Bilder in Farbe. Diese Bilder enthalten drei Kanäle:

Rot

, Grün und Blau und werden RGB-Bilder genannt. In diesem Fall müssen wir entgegen der obigen Formel die Intensität jedes -Kanals von 255 subtrahieren. Daher ist das Ausgabebild in Pixeln (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)
RGB 图像。在这种情况下,与上面的公式相反,我们需要从 255 中减去每个通道的强度。因此输出图像在像素 (i ,j)Nach der Einführung werfen wir einen Blick darauf, wie der Bildinversoperator in Python implementiert wird. Ich möchte der Einfachheit halber erwähnen, dass ich diesen Operator auf einem Graustufenbild ausführen werde. Aber ich gebe Ihnen einige Ideen zur Anwendung dieses Operators auf Farbbilder und überlasse Ihnen das vollständige Programm als Übung.

Bei Farbbildern müssen Sie zunächst den Intensitätswert jedes Pixelkanals (d. h. RGB) extrahieren. Dazu können Sie die Python Imaging Library (PIL) verwenden. Laden Sie weiterhin das Beispielbild eines Pavians von baboon.png herunter. Die Größe des Bildes sind die Rot-, Grün- und Blau-Intensitätswerte bei

. Dies kann wie folgt erfolgen:

from PIL import Image

im = Image.open('baboon.png')
print(im.getpixel((325,432)))
500x500。假设您要提取位于像素位置 (325, 432)Laut Dokumentation führt Methode

Folgendes aus:

getpixel()Gibt den Pixelwert an der angegebenen Stelle zurück.

Nachdem Sie das obige Skript ausgeführt haben, werden Sie feststellen, dass Sie nur die folgenden Ergebnisse erhalten:
Über. Überprüfen Sie das Muster, indem Sie die folgende Anweisung ausführen:

print(im.mode)
138!但是三个通道的 (RGB) 强度值在哪里?问题似乎与正在读取的图像的 modeSie erhalten die Ausgabe der

-Methode wie folgt:

rgb_im = im.convert('RGB')
P,这意味着图像是在调色板模式下读取的。您可以做的一件事是在返回不同通道的强度值之前将图像转换为 RGB 模式。为此,您可以使用 convert()In diesem Fall erhalten Sie folgenden Rückgabewert:

. Das bedeutet, dass die Intensitätswerte für den roten, grünen und blauen Kanal 180, 168 bzw. 178 betragen.

(180, 168, 178)Alles, was wir bisher beschrieben haben, zusammengenommen, sieht ein Python-Skript, das die RGB-Werte eines Bildes zurückgibt, so aus:

from PIL import Image

im = Image.open('baboon.png')
rgb_im = im.convert('RGB')
print(rgb_im.getpixel((325,432)))

Noch ein Punkt übrig, bevor wir zum Bildumkehroperator übergehen. Das obige Beispiel zeigt, wie der RGB-Wert von

nur einem

Pixel abgerufen wird. Wenn Sie jedoch den Umkehroperator ausführen, müssen Sie dies für alle Pixel tun. Um alle Intensitätswerte verschiedener Kanäle für jedes Pixel zu drucken, können Sie Folgendes tun:

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)))

An dieser Stelle belasse ich dies als Übung, damit Sie sehen, wie Sie den Bildinvertierungsoperator auf alle Farbbildkanäle (d. h. RGB) für jedes Pixel anwenden.

Sehen wir uns ein Beispiel für die Anwendung des Bildumkehroperators auf ein Graustufenbild an. Laden Sie boat.png herunter, das in diesem Abschnitt als Testbild dient. Es sieht so aus:

Python-basierte Bildverbesserungstechnologie

我将使用 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() 函数会将白色转换为黑色,反之亦然。

下面左边是原始图像,右边是新反转的图像。

Python-basierte Bildverbesserungstechnologie

请注意,应用该运算符后,图像的某些特征变得更加清晰。例如,看看右侧图像中的云彩和灯塔。

幂律变换

这个算子,也称为伽马校正,是我们可以用来增强图像的另一个算子。让我们看看算子方程。在像素 (i,j) 处,运算符如下所示:

p(i,j) = kI(i,j)^gamma

I(i,j) 是图像位置处的强度值 (i,j); kgamma 是正常数。我不会在这里讨论数学细节,但我相信您可以在图像处理书籍中找到该主题的详尽解释。但需要注意的是,在大多数情况下,k=1,所以我们主要是改变gamma的值。因此,上述方程可以简化为:

p(i,j) = I(i,j)^gamma

我将在这里使用 OpenCVNumPy 库。如果您需要了解有关该库的更多信息,请查看我的教程 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。下图显示了原始图像以及对该图像应用幂律变换算子的结果(左图为原始图像,右图为应用幂律变换算子后的结果)。

Python-basierte Bildverbesserungstechnologie

上面的结果是 gamma = 0.6 时的结果。让我们看看当我们将 gamma 增加到 1.5 时会发生什么,例如:

Python-basierte Bildverbesserungstechnologie

请注意,当我们增加伽马值时,图像会变得更暗,反之亦然。

您可能会问幂律变换有什么用处。事实上,用于图像采集、打印和显示的不同设备根据幂律变换算子进行响应。这是因为人脑使用伽马校正来处理图像。例如,当我们希望在计算机显示器或电视屏幕上正确显示图像(所有图像中显示最佳图像对比度)时,伽马校正就被认为很重要。

结论

在本教程中,您学习了如何使用 Python 增强图像。您已经了解了如何使用图像逆算子突出显示特征,以及如何将幂律变换视为在计算机显示器和电视屏幕上正确显示图像的关键算子。

Das obige ist der detaillierte Inhalt vonPython-basierte Bildverbesserungstechnologie. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn