《数字图像处理与机器视觉——Visual C++与Matlab实现》——0.3 数字图像处理的预备知识

简介:

本节书摘来自异步社区出版社《数字图像处理与机器视觉——Visual C++与Matlab实现》一书中的第0章,第0.3节,作者: 张铮 , 王艳平 , 薛桂香,更多章节内容可以访问云栖社区“异步社区”公众号查看。

0.3 数字图像处理的预备知识

数字图像处理与机器视觉——Visual C++与Matlab实现
数字图像是由一组具有一定空间位置关系的像素组成,因而具有一些度量和拓扑性质。理解像素间的关系是学习图像处理的必要准备,主要包括相邻像素,邻接性、连通性,区域、边界等概念,以及今后要用到的一些常见距离度量方法。另外0.3.3小节还将简单介绍几种基本的图像操作。

0.3.1 邻接性、连通性、区域和边界

为理解上述这些概念,需要首先了解相邻像素的概念。依据标准的不同,我们可以关注像素P的4邻域和8邻域,如图0.6所示。

image

1.邻接性(Adjacency)
定义V是用于决定邻接性的灰度值集合,它是一种相似性的度量,用于确定所需判断邻接性的像素之间的相似程度。比如在二值图像中,如果我们认为只有灰度值为1的像素是相似的,则V={1},当然相似性的规定具有主观标准,因此也可以认为V={0,1},此时邻接性完全由位置决定;而对于灰度图像,这个集合中则很可能包含更多的元素。此外,定义对角邻域N__D_(_P)为8-邻域中不属于4-邻域的部分(图0.10(c)),那么:

4邻接(4-Neighbor):如果Q∈N4(P),则称具有V中数值的两个像素P和Q是4邻接的。
8邻接(8-Neighbor):如果Q∈N8(P),则称具有V中数值的两个像素P和Q是8邻接的。
举例来说,图0.7(a),(b)分别是像素和Q、Q 1、Q 2的4邻接和8邻接示意图。而对于两个图像子集S 1和S 2,如果S 1中的某些像素和S 2中的某些像素相邻,则称这两个子集是邻接的。
image

2.连通性
为了定义像素的连通性,首先需要定义像素P到像素Q的通路(Path)。这也是建立在邻接性的基础上的。

像素P到像素Q的通路(Path)指的是一个特定的像素序列 ({x_0}, {y_0}), ({x_1}, {y_1}), …, ({x_n}, {y_n}),其中 (({x_0}, {y_0}) = ({x_p}, {y_p}),({x_n},{y_n}) = ({x_q}, {y_q})。并且像素 ({x_i}, {y_i}) 和 ({x_{i-1}}, {y_{i-1}}) 在满足1leqslantileqslantn时是邻接的。在上面的定义中,n是通路的长度,若 ({x_0},{y_0}) = ({x_n},{y_n}),则这条通路是闭合通路。相对应于邻接的概念,在这里有4通路和8通路。这个定义和图论中的通路定义基本相同,只是由于邻接概念的加入而变得更加复杂。

像素的连通性(Contiguous):令S代表一幅图像中的像素子集。如果在S中全部像素之间存在一个通路,则可以称2个像素P和Q在S中是连通的。此外,对于S中的任何像素P,S中连通到该像素的像素集叫做S的连通分量。如果S中仅有一个连通分量,则集合S叫做连通集。

3.区域和边界
区域的定义建立在连通集的基础上的。令R是图像中的一个像素子集,如果R同时是连通集,则称R为一个区域(Region)。

边界(Boundary)的概念是相对于区域而言的。一个区域的边界(或边缘、轮廓)是区域中所有包含一个或多个不在区域R中的邻接像素的像素所组成的集合。显然,如果区域R是整幅图像,那么边界就由图像的首行、首列、末行和末列定义。因而,通常情况下,区域指一幅图像的子集,并包括区域的边缘。而区域的边缘(Edge)则由具有某些导数值的像素组成,是一个像素及其直接邻域的局部性质,是一个有大小和方向属性的矢量。

边界和边缘是不同的。边界是和区域有关的全局概念,而边缘表示图像函数的局部性质。

0.3.2 距离度量的几种方法

基于上一小节提到的相关知识,我们来理解距离度量的概念。假设对于像素P({x_p}, {y_p}),Q({x_q}, {y_q}),R({x_r}, {y_r})而言,有函数D满足如下3个条件,则函数D可被称为距离函数或度量。
image

常见的几种距离函数有:

(i)欧氏距离

image

即距离等于r的像素形成以P为圆心的圆。

(ii)D4距离(街区距离)
image

即距离等于r的像素形成以P为中心的菱形。

(iii)D 8距离(棋盘距离)

image

即距离等于r的像素形成以P为中心的方形。

距离度量参数可以用于对图像特征进行比较、分类或者进行某些像素级操作。最常用的距离度量是欧氏距离,然而在形态学中,也可能使用街区距离和棋盘距离。

0.3.3 基本的图像操作

在后续章节中,将涉及各种各样的图像操作,这里以几种最为典型和常用的图像操作为例着重说明。按照处理图像的数量分类,可以分为对单幅图像操作(如滤波)和对多幅图像操作(如求和、求差和逻辑运算等);按照参与操作的像素范围的不同,可以分为点运算和邻域运算;而根据操作的数学性质,又可以分为线性操作和非线性操作。

1.点运算和邻域运算
点运算指的是对图像中的每一个像素逐个进行同样的灰度变换运算。设r和s分别是输入图像f(x,y)和输出图像g(x,y)在任一点(x, y)的灰度值,则点运算可以使用下式定义:

image

如果将点运算扩展,对图像中每一个小范围(邻域)内的像素进行灰度变换运算,即称为邻域运算或邻域滤波。这可以使用下式定义:
image

我们将分别在第3章和第5章介绍点运算和邻域运算。

2.线性和非线性操作
令H是一种算子,其输入输出都是图像。若对于任意两幅(或两组)图像F 1和F 2及任意两个标量a和b都有如下关系成立:
image

则称H为线性算子。即对两幅图像的线性组合应用该算子与分别应用该算子后的图像在进行同样的线性组合所得到的结果相同,也就是说算子H满足线性性质。同样,不符合上述定义的算子即为非线性算子,对应的是非线性图像操作。举例来说,滤波中的平均平滑,高斯平滑,梯度锐化等都是线性运算,而中值滤波(详见第5章“空间域图像增强”)则是非线性的。

线性操作由于其稳定性的特点在图像处理中占有非常重要的地位。尽管非线性算子常常也能够提供较好的性能,但它的不可预测性使其在一些如军事图像处理和医学图像处理等严格的应用领域中难以获得广泛的应用。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
6月前
|
Windows
Microsoft Visual C++2015-2019 安装失败 0x80240017
Microsoft Visual C++2015-2019 安装失败 0x80240017
174 0
|
4月前
|
编译器 开发工具 C++
【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
1699 0
|
5月前
|
存储 分布式数据库 API
技术好文:VisualC++查看文件被哪个进程占用
技术好文:VisualC++查看文件被哪个进程占用
|
2月前
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
3月前
|
安全 编译器 C++
Microsoft Visual C++ Redistributable的作用主要体现以及可以删除吗?
这些是Microsoft Visual C++不同版本的Redistributable安装包,用于32位系统,确保相关应用正常运行。它们提供C++运行时环境,简化部署流程,支持第三方库及框架,并确保应用兼容性。定期更新可修复问题并引入新功能。在空间有限或需解决程序冲突时可考虑删除,但需谨慎操作以防影响应用稳定性和兼容性。删除前请确认无应用依赖,并通过控制面板安全卸载。
137 1
Microsoft Visual C++ Redistributable的作用主要体现以及可以删除吗?
|
4月前
|
C++ Windows
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
在Windows上使用Visual Studio 2022进行FFmpeg和SDL2集成开发,首先安装FFmpeg至E:\msys64\usr\local\ffmpeg,然后新建C++控制台项目。在项目属性中,添加FFmpeg和SDL2的头文件及库文件目录。接着配置链接器的附加依赖项,包括多个FFmpeg及SDL2的lib文件。在代码中引入FFmpeg的`av_log`函数输出"Hello World",编译并运行,若看到"Hello World",即表示集成成功。详细步骤可参考《FFmpeg开发实战:从零基础到短视频上线》。
129 0
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
|
3月前
|
缓存 C++ Windows
Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
|
3月前
|
编译器 C++ 开发者
Visual Studio属性表:在新项目中加入已配置好的C++库
通过以上步骤可以确保Visual Studio中新项目成功地加入了之前已配置好的C++库。这个过程帮助开发者有效地管理多个项目中共享的库文件,提升开发效率。
79 0
|
5月前
|
JSON 开发工具 C语言
编程入门(五)【Visual Studio Code安装与C/C++语言运行】
编程入门(五)【Visual Studio Code安装与C/C++语言运行】
739 0
|
6月前
|
存储 C++ Python
LabVIEW使用Python MathWorks® MATLAB®软件和C/C++
LabVIEW使用Python MathWorks® MATLAB®软件和C/C++
52 0