《数字图像处理与机器视觉——Visual C++与Matlab实现(第2版)》——1.3 数字图像处理的预备知识

简介:

本节书摘来自异步社区出版社《Visual C++ 2012 开发权威指南》一书中的第1章,第1.3节,作者: 张铮 , 徐超 , 任淑霞 , 韩海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。

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

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

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

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

图0.8 P的各种邻域

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

(1)4邻接(4-Neighbor):如果Qin N_4left(Pright),则称具有V中数值的两个像素P和Q是4邻接的。

(2)8邻接(8-Neighbor):如果Qin N_8left(Pright),则称具有VQQ是8邻接的。

举例来说,图0.9(a)、图0.9(b)分别是像素和Q、Q_1、Q_2的4邻接和8邻接示意图。而对于两个图像子集S_1和S_2,如果S_1中的某些像素和S_2中的某些像素相邻,则称这两个子集是邻接的。

image

图0.9 邻接示意图

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})在满足1 le i le n时是邻接的。在上面的定义中,n是通路的长度,若(x_0,y_0)=left(x_n,y_nright),则这条通路是闭合通路。相对应于邻接的概念,在这里有4通路和8通路。这个定义和图论中的通路定义是基本相同的,只是由于邻接概念的加入而变得更加复杂。

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

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

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

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

距离度量的几种方法

基于上一小节提到的相关知识,来理解距离度量的概念。假设对于像素Pleft(x_p,y_pright)、Qleft(x_q,y_qright)、Rleft(x_r,y_rright)而言,有函数D满足如下3个条件,则函数D可被称为距离函数或度量。

image

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

③ D_8距离(棋盘距离)

image

(0-5)

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

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

1.3.3 基本的图像操作

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

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

image

(0-6)

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

image

(0-7)

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

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

image

(0-8)

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

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

相关文章
|
1月前
|
Windows
Microsoft Visual C++2015-2019 安装失败 0x80240017
Microsoft Visual C++2015-2019 安装失败 0x80240017
41 0
|
1月前
|
JSON C++ 数据格式
【C++】Visual Studio C++使用配置Json库文件(老爷式教学)
【C++】Visual Studio C++使用配置Json库文件(老爷式教学)
|
1月前
|
关系型数据库 数据库 C++
【C++】Windows使用Visual Studio C++链接云数据库PostgreSQL(沉浸式老爷教学)
【C++】Windows使用Visual Studio C++链接云数据库PostgreSQL(沉浸式老爷教学)
|
1天前
|
存储 C++ Python
LabVIEW使用Python MathWorks® MATLAB®软件和C/C++
LabVIEW使用Python MathWorks® MATLAB®软件和C/C++
|
1月前
|
存储 C++
【C++】Visual Studio C++ 配置并使用gtest(不好用你捶我)
【C++】Visual Studio C++ 配置并使用gtest(不好用你捶我)
|
2月前
|
算法 IDE Java
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
44 0
|
2月前
|
Java API 开发工具
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(三)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
32 0
|
2月前
|
Java 数据处理 数据库
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(二)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
37 0
|
2月前
|
存储 算法 Java
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(一)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
37 0
|
2月前
|
计算机视觉
数字图像处理笔记(一)Matlab实现直方图均衡化
数字图像处理笔记(一)Matlab实现直方图均衡化