让我开始学习一些理论术语,以免妨碍您的学习。 当我们谈论图像增强时 ,这基本上意味着我们想要一个比原始图像更合适的图像新版本。
例如,当您扫描文档时,输出图像的质量可能会比原始输入图像低。 因此,我们需要一种提高输出图像质量的方法,以使输出图像在视觉上对观看者更具表现力,而这正是图像增强发挥作用的地方。 增强图像时,我们正在做的是锐化图像特征,例如对比度和边缘。
重要的是要注意,图像增强功能不会增加图像的信息内容,而是会增加所选功能的动态范围,最终提高图像的质量。 因此,在这里我们实际上不知道输出图像的外观,但是我们应该能够(主观地)判断是否有任何改进,例如观察输出图像中的更多细节。
在数字图像处理(即分割,表示)的基本步骤中,图像增强通常用作预处理步骤。 有许多用于图像增强的技术,但是在本教程中,我将介绍两种技术: 图像逆 变换和幂律变换 。 我们将看看如何在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 Imaging Library(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.tiff ,它将作为本节中的测试图像。 看起来是这样的:

我将使用scipy库执行此任务。 在上述图像上应用图像逆运算符的Python脚本应如下所示:
import scipy.misc
from scipy import misc
from scipy.misc.pilutil import Image
im = Image.open('boat.tiff')
im_array = scipy.misc.fromimage(im)
im_inverse = 255 - im_array
im_result = scipy.misc.toimage(im_inverse)
misc.imsave('result.tiff',im_result)读取图像后,我们要做的第一件事是将其转换为ndarray ,以便对其应用图像逆运算符。 应用运算符后,我们只需将ndarray转换回图像并将该图像另存为result.tiff 。 下图显示了将图像反向应用到上方图像的结果(原始图像在左侧,而应用图像反向运算符的结果在右侧):

请注意,在应用运算符后,图像的某些功能变得更加清晰。 例如,看右图中的云层和灯塔。
幂律变换
该运算符,也称为伽玛校正 ,是我们可以用来增强图像的另一个运算符。 让我们看一下运算符的方程式。 在像素(i,j) ,运算符如下所示:
p(i,j) = kI(i,j)^gammaI(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会发生什么,例如:

请注意,随着我们增加gamma值,图像会变暗,反之亦然。
有人可能会问,幂律变换的用途是什么。 实际上,用于图像获取,打印和显示的不同设备根据幂定律变换运算符做出响应。 这是由于人脑使用伽玛校正来处理图像这一事实。 例如,当我们希望在计算机显示器或电视屏幕上正确显示图像(所有图像中显示最佳图像对比度)时,伽马校正就很重要。
结论
在本教程中,您学习了如何使用Python增强图像。 您已经了解了如何使用图像逆运算符来突出显示特征,以及如何将幂定律变换视为在计算机监视器和电视屏幕上正确显示图像的关键运算符。
此外,请不要犹豫,看看我们在Envato市场上可以出售和研究的东西 ,请提出任何问题,并使用下面的提要提供您的宝贵反馈。
翻译自: https://code.tutsplus.com/articles/image-enhancement-in-python--cms-29289