开发者社区> 异步社区> 正文

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

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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C++异常处理机制由浅入深, 以及函数调用汇编过程底层刨析. C++11智能指针底层模拟实现
C++异常处理机制由浅入深, 以及函数调用汇编过程底层刨析. C++11智能指针底层模拟实现
26 0
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
73 0
C++从面试常考实现特殊类到单例模式的实现
C++从面试常考实现特殊类到单例模式的实现
27 0
线程池设计, 从简单的我们平常设计线程池图解,到生活中的类似线程池的处理现实场景, 到简单的C++模拟nginx写的单链表组织工作队列的简单线程池实现 + nginx 部分源码刨析
线程池设计, 从简单的我们平常设计线程池图解,到生活中的类似线程池的处理现实场景, 到简单的C++模拟nginx写的单链表组织工作队列的简单线程池实现 + nginx 部分源码刨析
48 0
如何用c++实现异常处理
如何用c++实现异常处理
33 0
分块刨析从函数原型到分块实现C++STL(vector)
分块刨析从函数原型到分块实现C++STL(vector)
39 0
C++模板实现,支持多维,安全数组的完整代码
C++模板实现,支持多维,安全数组的完整代码
54 0
Kalman算法C++实现代码(编译运行通过)
Kalman算法C++实现代码(编译运行通过)
51 0
C++实现俄罗斯方块(附代码)
C++实现俄罗斯方块(附代码)
64 0
C++ 实现KMP字符串匹配算法
C++ 实现KMP字符串匹配算法
30 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
继承与功能组合
立即下载
对象的生命期管理
立即下载
移动与复制
立即下载