《数字图像处理与机器视觉——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章“空间域图像增强”)则是非线性的。

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

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

相关文章
|
22天前
|
存储 C++
【C++】Visual Studio C++ 配置并使用gtest(不好用你捶我)
【C++】Visual Studio C++ 配置并使用gtest(不好用你捶我)
|
30天前
|
算法 IDE Java
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
41 0
|
30天前
|
Java API 开发工具
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(三)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
30 0
|
30天前
|
Java 数据处理 数据库
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(二)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
34 0
|
30天前
|
存储 算法 Java
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(一)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
34 0
|
1月前
|
计算机视觉
数字图像处理笔记(一)Matlab实现直方图均衡化
数字图像处理笔记(一)Matlab实现直方图均衡化
|
1月前
|
存储 C++ Python
C++版本netCDF在Visual Studio中的部署
【2月更文挑战第20天】本文介绍在Windows电脑的Visual Studio软件中,配置C++语言最新版netCDF库的方法~
C++版本netCDF在Visual Studio中的部署
|
2月前
|
编译器 C++
Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案
Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案
48 0
Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案
|
4月前
|
定位技术 C++
Visual Studio复制、拷贝C++项目与第三方库配置信息到新的项目中
Visual Studio复制、拷贝C++项目与第三方库配置信息到新的项目中
|
4月前
|
C++ 计算机视觉
Visual Studio新项目快速配置已有项目中编译好的C++第三方库的方法
Visual Studio新项目快速配置已有项目中编译好的C++第三方库的方法