首頁 >後端開發 >Python教學 >基於Python的影像增強技術

基於Python的影像增強技術

王林
王林原創
2023-08-30 22:05:101220瀏覽

讓我透過一些理論術語來開始本教學。當我們談論圖像增強時,這基本上意味著我們想要一個比原始圖像更合適的新版本圖像。

例如,當您掃描文件時,輸出影像的品質可能低於原始輸入影像的品質。因此,我們需要一種方法來提高輸出影像的質量,以便它們在視覺上對觀看者來說更具表現力,這就是影像增強發揮作用的地方。當我們增強影像時,我們所做的是銳化影像的特徵,例如對比度和邊緣。

要注意的是,影像增強不會增加影像的資訊內容,而是增加所選特徵的動態範圍,最終提高影像的品質。因此,在這裡我們實際上不知道輸出影像會是什麼樣子,但我們應該能夠(主觀地)判斷是否有任何改進,例如觀察輸出影像中的更多細節。

影像增強通常用作數位影像處理(即分割、表示)所涉及的基本步驟中的預處理步驟。影像增強的技術有很多,但我將在本教程中介紹兩種技術:影像逆冪律變換。我們將看看如何在 Python 中實作它們。讓我們開始吧!

影像反轉

正如您可能從本節的標題中猜到的那樣(也可以稱為圖像求反),圖像反轉的目的是將輸入圖像中的暗強度轉換為圖像中的亮強度。輸出影像,以及輸入影像中的亮強度到輸出影像中的暗強度。換句話說,暗的區域變得更亮,明亮的區域變得更暗。

假設 I(i,j) 指的是位於 (i,j) 處的像素的強度值。這裡澄清一下,灰階影像中的強度值落在 [0,255] 範圍內,而 (i,j) 指的是行和列值, 分別。當我們對灰階影像套用影像逆運算子時,輸出像素 O(i,j) 值為:

O(i,j) = 255 - I(i,j)

現在,我們的大多數圖像都是彩色圖像。這些影像包含三個通道:紅色綠色藍色,稱為 RGB 影像。在這種情況下,與上面的公式相反,我們需要從 255 中減去每個通道的強度。因此輸出影像在像素 (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)

介紹完之後,讓我們來看看如何在 Python 中實作映像逆運算子。我想提一下,為了簡單起見,我將在灰階影像上運行該運算子。但我會給您一些關於在彩色圖像上應用該運算符的想法,並且我會將完整的程序留給您作為練習。

對於彩色影像,您需要做的第一件事是提取每個像素通道(即 RGB)強度值。為此,您可以使用 Python 成像庫 (PIL)。繼續從 baboon.png 下載範例狒狒影像。影像的大小為 500x500。假設您要擷取位於像素位置 (325, 432) 處的紅色、綠色和藍色強度值。這可以如下完成:

from PIL import Image

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

根據文檔,方法 getpixel() 的作用是:

傳回給定位置的像素值。

執行上面的腳本後,你會發現你只得到以下結果:138!但是三個通道的 (RGB) 強度值在哪裡?問題似乎與正在讀取的圖像的 mode 有關。透過執行以下語句檢查模式:

print(im.mode)

您將得到輸出 P,這表示影像是在調色板模式下讀取的。您可以做的一件事是在返回不同通道的強度值之前將影像轉換為 RGB 模式。為此,您可以使用 convert() 方法,如下所示:

rgb_im = im.convert('RGB')

在這種情況下,您將得到以下傳回值:(180, 168, 178)。這表示紅色、綠色和藍色通道的強度值分別為 180、168 和 178。

將我們迄今為止描述的所有內容放在一起,傳回圖片 RGB 值的 Python 腳本如下所示:

from PIL import Image

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

在繼續進行影像逆算子之前還剩一點。上面的範例展示如何僅檢索一個像素的RGB值,但在執行逆運算子時,您需要對所有像素執行該操作。

要列印每個像素的不同通道的所有強度值,您可以執行以下操作:

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

此時,我將把它當作練習,讓您了解如何在每個像素的所有彩色影像通道(即 RGB)上套用影像逆運算子。

讓我們來看一個在灰階影像上套用影像逆運算子的範例。繼續下載boat.png,它將作為我們在本節中的測試圖像。它看起來像這樣:

基於Python的影像增強技術

我将使用 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的影像增強技術

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

幂律变换

这个算子,也称为伽马校正,是我们可以用来增强图像的另一个算子。让我们看看算子方程。在像素 (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的影像增強技術

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

基於Python的影像增強技術

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

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

结论

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

以上是基於Python的影像增強技術的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn