基于Python的图像增强技术

王林
王林 原创
2023-08-30 22:05:10 652浏览

让我通过一些理论术语来开始本教程。当我们谈论图像增强时,这基本上意味着我们想要一个比原始图像更合适的新版本图像。

例如,当您扫描文档时,输出图像的质量可能低于原始输入图像的质量。因此,我们需要一种方法来提高输出图像的质量,以便它们在视觉上对观看者来说更具表现力,这就是图像增强发挥作用的地方。当我们增强图像时,我们所做的是锐化图像的特征,例如对比度和边缘。

需要注意的是,图像增强不会增加图像的信息内容,而是增加所选特征的动态范围,最终提高图像的质量。因此,在这里我们实际上不知道输出图像会是什么样子,但我们应该能够(主观地)判断是否有任何改进,例如观察输出图像中的更多细节。

图像增强通常用作数字图像处理(即分割、表示)所涉及的基本步骤中的预处理步骤。图像增强的技术有很多,但我将在本教程中介绍两种技术:图像逆幂律变换。我们将看看如何在 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核实处理。