基于Python的图像增强技术

冬婷同学_2799

冬婷同学_2799

2023-08-30

1399人浏览

原创

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

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

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

图像增强通常用作数字图像处理(即分割、表示)所涉及的基本步骤中的预处理步骤。图像增强的技术有很多,但我将在本教程中介绍两种技术:图像逆和幂律变换。我们将看看如何在 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); 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。下图显示了原始图像以及对该图像应用幂律变换算子的结果(左图为原始图像,右图为应用幂律变换算子后的结果)。

基于Python的图像增强技术

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

基于Python的图像增强技术

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

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

结论

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

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6204

49

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

3184

5

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

1852

13

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

60

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

20

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

40

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

140

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

80

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

80

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习