数字图像处理与Python实现笔记之基础知识

摘要

  1. 简要介绍数字图像处理涉及的一些基本概念、基本运算、基本类型,以及如何通过Python对数字图像进行读取和简单操作。
  2. 以彩色图像为例对数字图像处理的基本操作进行介绍,熟悉数字图像处理的基本过程,主要包括颜色空间的基本概念、伪彩色图像处理操作,彩色图像处理简单操作。
  3. 瞄准在空间域中对图像进行增强,介绍空间滤波的机理、基本概念以及使用的基本技术。本章内容包括空间滤波基本概念、基于空间滤波的图像平滑处理、基于空间滤波的锐化操作以及混合空间增强。
  4. 从频域角度入手对图像处理及增强方法展开介绍。因为频域滤波所需的数学知识较多,所以本章采取由浅入深的策略,首先介绍一维傅里叶变换,其次介绍二维傅里叶变换和快速傅里叶变换,最后介绍图像频域滤波中出现的各种技术,其大体可分为低通滤波和高通滤波两大类。
  5. 从全局特征提取和局部特征提取两方面入手,分别介绍颜色特征、纹理特征、形状特征、边缘特征、点特征的提取方法。本章内容是目前机器视觉和图像处理领域的学者关注较多的内容,通过穿插较多的实例,帮助读者理解图像特征提取的基本技术。
  6. 瞄准如何减少图像传输及存储数据大小,介绍主要使用的压缩技术,包括有损压缩和无损压缩等,并使用JPEG压缩技术串讲全章知识点。
  7. 介绍图像的小波域表示及多分辨率表示。

绪论

  • 人工智能是引领未来发展的战略性技术,是新一轮科技革命和产业变革的重要驱动力量,将深刻地改变人类社会生活。

  • 促进人工智能和实体经济的深度融合,构建数据驱动、人机协同、跨界融合、共创分享的智能经济形态,更是推动质量变革、效率变革、动力变革的重要途经。

  • 进年来,我国人工智能新技术、新产品、新业态持续涌现,与农业、制造业、服务业等行业的融合步伐明显加快,在技术创新、应用推广、产业发展等方面成效初显。

  • 人工智能技术并不是一个新生事物,它在最近几年引起全球性关注并得到飞速发展的主要原因,在于它的三个基本要素(算法、数据、算力)的迅猛发展,其中又以数据和算力的发展尤为重要。

  • 物联网技术的蓬勃发展使得数据累计的难度越来越低,而芯片算力的不断提升,使得过去只能通过云计算才能完成的人工智能运算,现在可以下沉到最普通的设备上完成。

  • 物联网技术为机器带来感知能力,而人工智能则通过计算算力为机器带来了决策能力,正如感知和大脑对自然生命进化所起到的必然性作用。

1 数字图像处理基础知识

本章介绍数字图像的一些基础知识和基本概念,包括数字图像处理基本原理及常见方法、图像的采样和量化、图像的表示和可视化、图像中像素间的关系、黑白图像以及灰度图像。

  • 图像处理是指对图像进行一系列操作,旨在优化图像或从图像中抽取某种有用信息。
  • 图像处理是信号处理的一种,其输入为一幅图像,输出是优化后的图像或抽取出的图像特征。
  • 按照图像信号类型的不同,图像处理可以分为数字图像处理和模拟图像处理两种类型。
  • 模拟图像处理是指在模拟介质(如胶片)中通过模拟成像器件(如相机镜头)对连续模拟信号进行处理。
  • 数字图像处理是指以离散数字图像信号为处理对象,通过计算机对图像进行处理,以便更好的从图像中获取信息。

1.1 数字图像简介

  • 图是客观世界物体反射或投射光的分布,是客观世界的反映。像是人类视觉系统对图的响应,是人的大脑对图的印象或认识,是人的一种感觉。
  • 图像(image)是图和像的有机结合,既反映物体的客观存在,又体现人的感知因素。图像处理旨在针对特定任务,提升图像的可理解性。

1.1.1 数字图像处理的目的

数字图像处理是指借助计算机强大的运算能力,运用去噪、特征提取、增强等技术,对数字形式存储的图像进行加工、处理。

  • 提升图像的视觉感知质量。抑制图像中某些成分的表现力,提升图像中特定成分的表现力,改善图像视觉感知效果。
  • 提取图像中感兴趣区域或特征。作为图像分类、分割、语义标注等的依据,为图像分析提供便利。
  • 方便图像的存储和传输。为了减少图像的存储空间,降低图像在网络传输中的耗时,可首先使用各类编码方法对图像进行编码,然后使用JPEG、BMP等压缩标准对图像进行压缩。

1.1.2 数字图像处理的应用

  • 遥感分析技术的广泛应用图像。
  • 基于数字图像识别的身份认证系统。
  • 美图软件。通过物体识别、高斯模糊等简单图像处理方法实现了快速美化。
  • 光学字符识别。首先利用图像分割得到单个字符图像,其次通过特征提取得到单个字符特征,最后经过图像识别算法提取图像中的文本内容,形成文本文档。

1.1.3 数字图像处理的特点

  • 可再现能力强。数字图像存储的基本单元是由离散数值构成的像素,其一旦形成不容易受存储、传输、复制过程干扰。
  • 处理精度高。现代数字图像获取技术可以将每个像素基元的灰度级量化到32位甚至更多位数,可以保证数字图像在颜色细节上满足真实图像颜色分辨率的要求。
  • 适用范围广。不论尺度大小、来源各异,在进行数字图像处理时,均会被转化为由二维数组编码的图像形式。
  • 灵活性高。线性运算与非线性运算,点运算与局部区域运算,空间域与频域转换。

1.1.4 常见的数字图像处理方法

  • 数字图像处理的一般步骤:图像信息的获取、存储、处理、传输、展示。
  • 常见数字图像处理方法:图像的数字化、编码、增强、恢复、变换、压缩、存储、传输、分析、识别、分割、描述、分类。
  • 图像分割的主要目的是将图像分解为若干有意义的部分。图像分割技术可以作为图像识别、分析、理解的基础。在图像分割的基础上,形成图像的区域、边缘特征描述,借助模式识别相关技术,完成图像的语义分析和理解。
  • 图像分类(识别)是模式识别领域的重要技术之一,其主要目的是对图像的类型进行判别或者对图像中出现的物体进行检测和识别。图像分类的一般步骤:进行图像特征提取和描述、使用模式识别技术进行分类器或检测器的训练、对目标图像进行分类和识别。

1.2 图像采集和量化

  • 图像的数字化是将连续的模拟图像转换为计算机可处理的离散数字图像的过程,包括采样和量化。
  • 采样是图像空间坐标的离散化,决定了图像的空间分辨率,是对原始图像信号的一种数字化逼近。
  • 量化是图像响应幅值的离散化,决定了图像的灰度分辨率。

1.2.1 图像采样

  • 图像采样是将一幅在空间上连续分布的模拟图像成M*N的网格,每个网格称为一个像素,M*N称为图像的空间分辨率。
  • 使用求均值方法进行图像模拟采样的代码如下。
# coding=utf-8
# 导入所需要的包
from skimage import data
from matplotlib import pylot as plt
import numpy as np

image = data.coffee()  # 载入测试图像
print(image.shape)  # 显示图像原始大小
print(type(image))  # 显示图像类型
ratio = 20  # 设置采样比率
# 设置采样后的图片大小
image1 = np.zeros((int(image.shape[0] / ratio), int(image.shape[1] / ratio), image.shape[2]), dtype='int32')
# 对图像进遍历
for i in range(image1.shape[0]):
    for j in range(image1.shape[1]):
        for k in range(image1.shape[2]):
            delta = image[i * ratio:(i + 1) * ratio, j * ratio:(j + 1) * ratio, k]  # 获取需要采样的图像块
            image1[i, j, k] = np.mean(delta)  # 计算均值,并存入结果图像

plt.imshow(image1)
plt.show()  # 打印采样后的图像
  • 显示图像原始大小和图片类型
    在这里插入图片描述

  • 使用求均值方法对图像进行采样
    在这里插入图片描述

1.2.2 图像量化

  • 模拟图像经过采样后,在空间上实现了离散化,并形成像素,但采样所得的像素值(即灰度值)依旧是连续量。
  • 采样后所得的各像素的灰度值从连续量到离散量的转换称为图像灰度的量化。
  • 图像的像素值(响应值)I(x,y)的数字化被称为图像的量化,即将图像响应值I(x,y)ImaxImin的实数域映射为有限级别的离散值。
  • 图像量化的部分模拟的Python代码如下。
# coding=utf-8
from skimage import data
from matplotlib import pyplot as plt

image = data.coffee()  # 载入测试图像
radio = 128  # 设置量化比率
for i in range(image.shape[0]):
    for j in range(image.shape[1]):
        for k in range(image.shape[2]):
            # 对图像中每个像素进行量化
            image[i][j][k] = int(image[i][j][k] / radio) * radio

plt.imshow(image)  # 打印采样后的图像
plt.show()
  • 图像的量化比率决定了图像的颜色精细程度。
  • 将256级灰度的彩色图像量化到仅有2级的灰度图像
    在这里插入图片描述
  • 将256级灰度的彩色图像量化到仅有4级的灰度图像
    在这里插入图片描述

1.3 图像的表示和可视化

  • 经过采样和量化之后,图像已经成为空间位置和响应值均离散的数字图像。

1.3.1 图像的表示

  • 通过采样和量化,原本连续的图像I=(x,y)转换为一个二维阵列f(x,y),该阵列具有M行N列,其中(x,y)是离散坐标。
  • 一般地,直接使用二维矩阵A表示量化后的图像更方便。二维矩阵是表示数字图像的重要方式,矩阵中每个元素称为图像的像素,每个像素都有它自己的空间位置和值,值是这一位置像素的颜色或者强度。
  • 图像分辨率是指组成一幅图像的像素密度。对同样大小的一幅图,组成该图的图像像素数目越多,说明图像的分辨率越高,看起来越逼真。
  • 图像分辨率包括空间分辨率和灰度级(响应幅度)分辨率。空间分辨率是图像中可辩别的最小空间细节,取样值对少是决定图像空间分辨率的主要参数。灰度级分辨率是指灰度级别中可分辨的最小变化。灰度级数通常是2的整数次幂。
  • 按照图像矩阵包含元素的不同,大概可以分为二值图像、灰度图像、彩色图像。
  • 文件内图像的表示一般分为矢量表示和栅格表示。
    矢量表示中,图像用一系列线段或线段的组合体表示。矢量图像类似程序文件,里面有一系列命令和数据,执行这些命令可根据数据画出图案,常用的工程绘图软件有AutoCADVisio等。
  • 栅格图像又称位图图像或像素图像,使用矩阵或离散的像素点表示图像,放大后会出现方块效应。

1.3.2 图像的格式

  • 图像数据文件的格式有很多,不同的系统平台和软件常使用不同的图像格式。
  • 常用的图像数据文件格式有BMP图像格式、JPEG图像格式、GIF图像格式等。

1.3.3 图像的基本属性

  • 图像像素数量。图像像素数量是指在位图图像的水平和垂直方向上包含的像素数量。
  • 图像分辨率。图像在单位打印长度上分布的像素数量,主要用以表征数字图像信息的密度,决定了图像的清晰程度。在单位大小面积上,图像的分辨率越高,包含的像素点的数量越多,像素点越密集,数字图像的清晰度也就越高。
  • 图像大小。决定存储图像文件所需的存储空间,字节数(单位B)=(位图高 * 位图宽 * 图像深度)/ 8.
  • 图像颜色。指数字图像中具有的最多数量的可能颜色种类,通过改变红、绿、蓝三原色的比例,可以非常容易地混合成任意一种颜色。
  • 图像深度。又称图像的位深,是指图像中每个像素点所占的位数。数据深度越深,所需位数越多,对应的颜色表示也就越丰富。
  • 图像色调。指各种图像颜色对应原色的明暗程度。
  • 图像饱和度。表明了图像中颜色的纯度。一般用纯色中混入白光的比例衡量饱和度,纯色中混入的白光越多,饱和度越低。
  • 图像亮度。指数字图像中包含色彩的明暗程度,是人眼对物体本身明暗程度的感觉。
  • 图像对比度。图像中不同颜色的对比或者明暗程度的对比。对比度越大,颜色之间的亮度差异越大或者黑白差异越大。
  • 图像层次。在计算机设计系统中,为了更加便捷有效的处理图像素材,通常将他们置于不同的层中,而图像可看作由若干层图像叠加而成。

1.3.4 图像可视化模块

使用python3.7和skimage工具包对图像可视化。与OpenCV相比,skimage更容易安装和使用,对像素的操作和图像整体的操作更符合科学计算要求。

  • io 读取、保存和显示图片或视频
  • data 提供一些测试图片和样本数据
  • color 颜色空间变换
  • filters 图像增强、边缘检测、排序滤波器、自动阈值等滤波器操作
  • draw 操作于numpy数组上的基本图形绘制,包括线条、矩形、圆和文本等。
  • transform 几何变换或其他变换,如旋转、拉伸等
  • morphology 形态学操作,如开闭运算、骨架提取等
  • exposure 图片强度调整,如亮度调整、直方图均衡等
  • feature 特征检测与提取等模块
  • measure 图形属性的测量,如相似性或等高线
  • segmentation 图像分割
  • restoration 图像恢复
  • util 通用工具函数

1.4 像素间的关系

像素间的关系主要对像素与像素之间的关联进行描述,基本关系包括像素间的领域关系、连通性、像素之间的距离。

  • 领域关系。用于描述相邻像素之间的相邻关系,包括4邻域和D邻域。
  • 连通性。描述区域和边界的重要概念。两个像素连通的必要条件是:两个像素的位置满足相邻关系且两个像素的灰度值满足特定的相似性准则。
  • 像素之间的距离。常用的像素间距离度量包括欧式距离、D4距离(城市距离)及D8距离(棋盘距离)。

1.5 简单图像处理

  • 数字图像的本质是一个多维矩阵。数字图像处理的本质是对多维矩阵的操作。
  • 按照处理对象的不同,可将数字图像处理分为黑白图像处理、灰度图像处理、彩色图像处理。
  • 按照处理方法进行划分,可将数字图像处理分为空间于处理与频域处理。
  • 按照处理策略不同,数字图像处理可分为全局处理和局部处理。

1.5.1 图像基本属性的操作

  • 亮度操作。亮度也称灰度,是颜色的明暗变化范围,常用0% ~ 100%(由黑到白)表示。通过常见的线性运算即可完成亮度调节,如所有像素点亮度值乘以或者加一个增强系数,使得图像整体变亮或者变暗。
  • 对比度操作。即图像暗和亮的落差值,即图像最大灰度级和最小灰度级之间的差值。a=1时是原图;a>1时对比度增强,图像看起来更加清晰。a<1时对比度减弱,图像看起来变暗。
# 针对彩色图像进行操作
import numpy as np

# 改变对比度函数
def change_alpha(im, a):
    im_changed = np.zeros(shape=im.shape, dtype='uint8')
    for i in range(im.shape[0]):
        for j in range(im.shape[1]):
            for k in range(im.shape[2]):
                if im[i, j, k] * a > 255:
                    im_changed[i, j, k] = 255
                elif im[i, j, k] < 0:
                    im_changed[i, j, k] = 0
                else:
                    im_changed[i, j, k] = im[i, j, k] * a
    return im_changed

  • a=1时是原图
    在这里插入图片描述
  • a>1时对比度增强,图像看起来更加清晰
    在这里插入图片描述
  • a<1时对比度减弱,图像看起来变暗
    在这里插入图片描述
  • 颜色通道操作。数字图像的本质是一个多维矩阵,如彩色图像是一个三维矩阵,灰度图像和黑白图像由二维矩阵表示。彩色图像一般分为红、绿、蓝3个颜色通道,每个颜色通道对应一个完整的二维矩阵。对图像3个颜色通道进行分离的代码如下。
# coding=utf-8
from skimage import data, io
from matplotlib import pyplot as plt

# 读入图像
image = data.coffee()
# 分别取出红、绿、蓝三个颜色通道
image_r = image[:, :, 0]
image_g = image[:, :, 1]
image_b = image[:, :, 2]
# 分别显示3个通道
plt.subplot(2, 2, 1)
io.imshow(image)

plt.subplot(2, 2, 2)
io.imshow(image_r)

plt.subplot(2, 2, 3)
io.imshow(image_g)

plt.subplot(2, 2, 4)
io.imshow(image_b)

plt.show()

在这里插入图片描述

1.5.2 图像的简单运算

图像运算是以图像为单位,对图像进行的数学操作,是数字图像信号处理的基础,运算对象以像素点为基本单位,运算结果为一幅灰度分布与原图像不同的新图像。

  • 算术运算和逻辑运算。每次只涉及一个空间像素的位置,所以可以“原地”操作,即从原存放输入图像的空间直接得到输出图像。两幅灰度图像的加减法示例代码如下。
# coding=utf-8
from matplotlib.font_manager import FontProperties

font_set = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=12)
from skimage import data
from matplotlib import pyplot as plt

moon = data.moon()
camera = data.camera()
image_minus = moon - camera
image_plus = moon + camera
plt.set_cmap(cmap='gray')

plt.subplot(2, 2, 1)
plt.title('月亮图像', fontproperties=font_set)
plt.imshow(moon)

plt.subplot(2, 2, 2)
plt.title('摄影师图像', fontproperties=font_set)
plt.imshow(camera)

plt.subplot(2, 2, 3)
plt.title('月亮加摄影师图像', fontproperties=font_set)
plt.imshow(image_plus)

plt.subplot(2, 2, 4)
plt.title('月亮减摄影师图像', fontproperties=font_set)
plt.imshow(image_minus)

plt.show()

在这里插入图片描述

  • 点运算。点运算只涉及一幅图像(称为输入图像),运算对象是输入图像像素的灰度值,即输出图像每个像素的灰度值仅取决于输入图像中对应像素的灰度值。
  • 点运算有两个特点:其一,根据某种预先设置的规则,将输入图像各个像素本身的灰度逐一转换成输出图像对应像素的灰度值。其二,点运算不会改变像素的空间位置。因此,点运算也称为灰度变换。
  • 点运算可以分为线性点运算和非线性点运算。线性点运算的原值和目标值通过线性方程完成转换,典型的线性点运算如对比度灰度调整、图像反色等。非线性点运算对应非线性映射函数,典型的映射函数包括平方函数、对数函数、窗口函数(截取)、阈值函数、多值量化函数等。灰度幂次变换、灰度对数变换、阈值化处理、直方图均衡化是较常见的非线性点运算方法。
  • skimageexposure模块中包含幂次变换的函数adjust_gamma,可以对图像进行幂次变换。幂次变换为非线性变换,图像中某些部分可以通过幂次变换凸显出来。
# coding=utf-8
from skimage import data, io, exposure
from matplotlib import pyplot as plt

# 读入图像
image = data.coffee()

# 分别计算gamma=0.2,0.67,25时的图像
image_1 = exposure.adjust_gamma(image, 0.2)
image_2 = exposure.adjust_gamma(image, 0.67)
image_3 = exposure.adjust_gamma(image, 25)

# 分别展示原图和结果图像
plt.subplot(2, 2, 1)
plt.title('gamma=1')
io.imshow(image)

plt.subplot(2, 2, 2)
plt.title('gamma=0.2')
io.imshow(image_1)

plt.subplot(2, 2, 3)
plt.title('gamma=0.67')
io.imshow(image_2)

plt.subplot(2, 2, 4)
plt.title('gamma=25')
io.imshow(image_3)

plt.show()

在这里插入图片描述

  • 图像直方图。描述了该图像中关于颜色的数量特征,可以反映颜色的统计分布和基本色调。颜色直方图可以分为三类:全局直方图、累加直方图、主色调直方图。如下代码给出了使用skimage的exposure的histogram()函数计算直方图的方法。
# coding=utf-8
from skimage import data, exposure

# 读入图像
image = data.coffee()

# 计算直方图
hist_r = exposure.histogram(image[:, :, 0], nbins=256)
hist_g = exposure.histogram(image[:, :, 1], nbins=256)
hist_b = exposure.histogram(image[:, :, 2], nbins=256)
  • 直方图均衡化是通过使用累积函数对灰度值进行调整,以实现对比度增强。直方图均衡化处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
  • 直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图的主要作用是将灰度间隔小的图像的灰度间隔扩大,以便观察图像。直方图均衡化的代码如下。
# coding=utf-8
from skimage import data, exposure
from matplotlib.pyplot as plt

# 读入图像
img = data.moon()
plt.figure('hist', figsize=(8, 8))
arr = img.flatten()

plt.subplot(2, 2, 1)
plt.imshow(img, plt.cm.gray)  # 原始图像

plt.subplot(2, 2, 2)
plt.hist(arr, bins=256, normed=1, edgecolor='None', facecolor='red')  # 原始图像直方图

img1 = exposure.equalize_hist(img)
arr1 = img1.flatten()

plt.subplot(2, 2, 3)
plt.imshow(img1, plt.cm.gray)  # 均衡化

plt.subplot(2, 2, 4)
plt.hist(arr1, bins=256, normed=1, edgecolor='None', facecolor='red') # 均衡化直方图

1.5.3 图像卷积操作

  • 图像卷积操作是图像空间域滤波的基础运算,也是当前深度特征提取算法的基础。卷积操作就是循环将图像和卷积核逐个元素相乘再求和,结果得到卷积后图像的过程。
  • 卷积操作中,卷积核在原始图像上做从上到下、从左到右的滑动扫描,每次扫描使用卷积核与其扫描覆盖区域图像做一次卷积运算,然后再移动到下一个位置进行下一次扫描。
  • 大部分Python图像处理相关包均将卷积函数集成到特征提取或者滤波模块中,并对卷积操作进行了优化

1.6 小结

本章简要介绍了数字图像处理的基本概念,介绍了基于Python进行数字图像处理的简单语法,对数字图像处理中遇到的一些基本操作及运算进行了简单实现。

猜你喜欢

转载自blog.csdn.net/qq_40507857/article/details/107570020