• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

使用Python增强图像质量

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

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

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

我将使用 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增强图像质量  第2张

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

幂律变换

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

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

I(i,j)是图像位置的强度值(i,j);和是正常k数gamma。我不会在这里深入讨论数学细节,但我相信您可以在图像处理书籍中找到对这个主题的详尽解释。但是,请务必注意,在大多数情况下,k=1,因此我们将主要更改伽玛值。因此,上述等式可以简化为:

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

我将在这里使用OpenCV和NumPy库。如果您需要了解有关该库的更多信息,请查看我的教程Introducing 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)

请注意,我们选择的伽玛值是0.6。下图显示了原始图像和对该图像应用幂律变换算子的结果(左图显示原始图像,右图显示应用幂律变换算子后的结果)。

使用Python增强图像质量  第3张

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

使用Python增强图像质量  第4张

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

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

结论

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


文章目录
  • 图像反转
  • 幂律变换
  • 结论
  • 发表评论