数字图像的距离变换算法

  • 一、图像数字化
  • 二、距离
  • 三、距离变换
  • 四、OpenCV代码实现

一、图像数字化

通过传感器获得的图像是平面坐标(x,y)的连续函数f(x,y),它的值图像对应位置的亮度。为了能够让计算机来处理,需要对图像进行采样,并且对亮度值进行量化。

1、采样。对连续函数f(x,y)进行采样,就是分别对x轴和y轴,按照固定间隔取值,得到平面坐标上的M×N个点,将其函数值作为元素生成M行N列的矩阵。

2、量化亮度值。将f(x,y)的值转化为等价的整数值的过程称为量化,量化的级别越高,图像越细致。通常将亮度值表示为0-255之间的整数。

这样,在计算机中通常以矩阵表示数字图像,矩阵的元素对应图像的亮度信息。

二、距离

满足以下三个条件的函数DDD称作距离:
(1)同一性:D(p,q)≥0。当且仅当p=q时,D(p,q)=0。D(p,q)\ge 0。 当且仅当p=q时,D(p,q)=0。D(p,q)≥0。当且仅当p=q时,D(p,q)=0。

(2)对称性:D(p,q)=D(q,p)。D(p,q)=D(q,p)。D(p,q)=D(q,p)。

(3)三角不等式:D(p,r)≤D(p,q)+D(q,r)。D(p,r)\le D(p,q)+D(q,r)。D(p,r)≤D(p,q)+D(q,r)。

数字图像的距离有多种定义方式,包括欧式距离、城市街区距离、棋盘距离等。以下以两坐标点a=(i,j)a=(i,j)a=(i,j)和b=(k,l)b=(k,l)b=(k,l)的距离为例,来说明各种距离的定义方式。

欧式距离De{D_e}De​就是通常所说的距离,它定义为
De(a,b)=((i−k)2)+(j−l)2D_e(a,b)=\sqrt{((i-k)^2)+(j-l)^2}De​(a,b)=((i−k)2)+(j−l)2​

欧式距离在事实上比较直观,但是平方根计算比较费时,且距离可能不是数。

城市街区距离D4D_4D4​,它定义为在只允许横向和纵向运动的情况下,从起点到终点的移动步数。用公式表示为
D4(a,b)=∣i−k∣+∣j−l∣D_4(a,b)=|i-k|+|j-l|D4​(a,b)=∣i−k∣+∣j−l∣

符号D4D_4D4​中的444表示在这种定义下,像素点是444邻接的,即每个点只与它的上、下、左、右相邻的444个点之间的距离为111。

如果允许横向、纵向和沿对角线方向移动,则可以得到棋盘距离D8D_8D8​的定义
D8(a,b)=max{∣i−k∣,∣j−l∣}D_8(a,b)=max\{|i-k|,|j-l|\}D8​(a,b)=max{∣i−k∣,∣j−l∣}

符号D8D_8D8​中的888表示在这种定义下,像素点是888邻接的,即每个点只与它的上、下、左、右、四个对角线方向相邻的888个点之间的距离为111。

显然,以上三种距离的定义都满足距离的定义条件。

三、距离变换

距离变换也叫作距离函数或者斜切算法。它是距离概念的一个应用,图像处理的一些算法以距离变换为基础。距离变换描述的是图像中像素点与某个区域块的距离,区域块中的像素点值为0,临近区域块的像素点有较小的值,离它越远值越大。

以二值图像为例,其中区域块内部的像素值为1,其他像素值为0。距离变换给出每个像素点到最近的区域块边界的距离,区域块内部的距离变换结果为0。输入图像如图1所示,D4距离的距离变换结果如图2所示。

下面来讨论距离变换算法,其核心是利用两个小的局部掩膜遍历图像。第一遍利用掩模1,左上角开始,从左往右,从上往下。第二遍利用第二个掩模,右下角开始,从右往左,从下往上。掩模形状如下图所示:

按照某种距离(如:D4D_4D4​距离或D8D_8D8​距离)对大小为M×NM×NM×N的图像中的区域块作距离变换,算法过程如下:

1、建立一个大小为M×NM×NM×N的数组FFF,作如下的初始化:将区域块中的元素设置为000,其余元素设置为无穷;

2、利用掩模1(mask1),左上角开始,从左往右,从上往下遍历数组,将掩模中P点对应的元素的值作如下更新:
F(P)=minq∈mask1{F(P),D(P,q)+F(q)}F(P)=\underset{{q\in mask1}}{min}\{F(P),D(P,q)+F(q)\}F(P)=q∈mask1min​{F(P),D(P,q)+F(q)}

3、利用掩模2(mask2),右下角开始,从右往左,从下往上遍历数组,将掩模中P点对应的元素的值作如下更新:
F(P)=minq∈mask2{F(P),D(P,q)+F(q)}F(P)=\underset{{q\in mask2}}{min}\{F(P),D(P,q)+F(q)\}F(P)=q∈mask2min​{F(P),D(P,q)+F(q)}

最终得到的更新后的数组即为距离变换的结果。

这个算法过程在图像编边界需要做出调整,因为在边界处,掩模不能全部覆盖图像,这时可以将掩模中没有对应元素的位置的值当作0来处理。

四、OpenCV代码实现

这个算法过程经过很多的改进,但基本原理并没有区别。开源计算机视觉库OpenCV中,距离变换算法有相应的实现,声明如下:

CV_EXPORTS_W void distanceTransform( InputArray src, OutputArray dst,int distanceType, int maskSize, int dstType=CV_32F);

参数详解:

  • InputArray src:输入图像,一般为二值图像;
  • OutputArray dst:输出的图像,距离变换结果;
  • int distanceType:用于距离变换的距离类型(欧氏距离:DIST_L2 = 2;D4D_4D4​距离:DIST_L1 = 1;D8D_8D8​距离:DIST_C = 3等);
  • int mask_size:距离变换掩模的大小,一般为3或5;
  • int dstType:输出图像的数据类型,可以为CV_8U或CV_32F。

下面我们用一个具体的例子来展示距离变换的效果。将大小为480×480480\times480480×480,其中有三个像素点设置为1,其余都为0的一张图片作为输入图像,分别在欧式距离、D4D_4D4​距离和D8D_8D8​距离下,距离变换的结果。

效果如下图所示:

下面是代码实现:

#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;int main()
{//初始化输入图像和变换结果图像Mat mat(480, 480, CV_8UC1, Scalar(0)), transMatE, transMatD4, transMatD8;//给输入图像指定三个像素点作为距离变换原点(区域块)mat.at<uchar>(100, 200) = 1;mat.at<uchar>(200, 100) = 1;mat.at<uchar>(300, 300) = 1;//将将输入图像中1和0调换,使得原点距离为0mat = 1 - mat;//显示原始图像(显示为黑色)imshow("原始图片", mat);//分别利用欧式距离、D4距离和D8距离作距离变换,将结果存入transMatD4、transMatD8和transMatEdistanceTransform(mat, transMatE, DIST_L2, 0);distanceTransform(mat, transMatD4, DIST_L1, 0, CV_8U);distanceTransform(mat, transMatD8, DIST_C, 0);//欧式距离与D8距离作变换后,值为32位浮点数,以下代码将其值转为uchar类型transMatE.convertTo(transMatE, CV_8U);transMatD8.convertTo(transMatD8, CV_8U);//显示距离变换结果imshow("欧式距离变换后的图片", transMatE);imshow("D4距离变换后的图片", transMatD4);imshow("D8距离变换后的图片", transMatD8);waitKey();return 0;

数字图像的距离变换算法相关推荐

  1. 【OpenCV】数字图像的距离变换算法

    数字图像的距离变换算法 图像数字化 距离 距离变换 OpenCV代码实现 C++ Python 参考博客 图像数字化 通过传感器获得的图像是平面坐标(x,y)的连续函数f(x,y),它的值图像对应位置 ...

  2. 【图像处理】——距离变换算法

    前言 通过本文可以了解到 什么是图像的距离? 什么是距离变换 距离变换的计算 OpenCV中距离变换的实现 什么是图像的距离? 距离(distance)是描述图像两点像素之间的远近关系的度量,常见的度 ...

  3. 二值图像的距离变换研究

    http://blog.csdn.net/trent1985/article/details/18081761 [研究内容] 二值图像距离变换 [正文] 二值图像距离变换的概念由Rosenfeld和P ...

  4. OpenCV(26)图像分割 -- 距离变换与分水岭算法(硬币检测、扑克牌检测、车道检测)

    目录 一.基础理论 1.思想 2.原理 二.分水岭实战:硬币 步骤归纳 1.把原图像转二值图 2.开运算去噪 3.确定背景区域(膨胀)(得到背景/最大连通域) 4.确定前景区域(距离变换) (分离)( ...

  5. OpenCV距离变换和分水岭算法的图像分割

    OpenCV距离变换和分水岭算法的图像分割 距离变换和分水岭算法的图像分割 目标 代码 说明/结果 距离变换和分水岭算法的图像分割 目标 在本教程中,您将学习如何: 使用OpenCV函数cv :: f ...

  6. matlab距离变换,距离变换的图像分割和Watershed算法

    目标 在本教程中,您将学习如何:使用OpenCV函数cv :: filter2D为了执行一些拉普拉斯滤波来进行图像锐化 使用OpenCV函数cv :: distanceTransform来获得二进制图 ...

  7. 【OpenCV 4开发详解】图像距离变换

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  8. 图像识别中距离变换的原理及作用详解,并附用OpenCV中的distanceTransform实现距离变换的代码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 距离变换的定义是计算一个图像中非零像素点到最近的 ...

  9. OpenCV 距离变换的笔记

    目前正在学习<图像处理,分析与机器视觉>里面有提到距离变换计算,以此笔记记录生活.  距离变换的定义 :计算图像中像素点到最近零像素点的距离,也就是零像素点的最短距离. Mat srcIm ...

最新文章

  1. android 手写字体识别,一种基于Android系统的手写数学公式识别及生成MathML的方法...
  2. 百度第七期智能对话训练营来了!
  3. GdiPlus[59]: 图像(十一) IGPImageAttributes 之颜色矩阵(TGPColorMatrix)变换
  4. 《ASP.NET 2.0开发指南》随书光盘 安装问题
  5. spring10: 引用类型的自动注入
  6. python速成要多久2019-8-28_Python脱产8期 Day13 2019/4/28
  7. oracle sql 调用自定义函数_PSCAD入门教程(第7节):怎样调用fortran编写的自定义函数?(附模型)...
  8. c语言异或加密函数,用异或算法实现文件的简单加密
  9. r740服务器增加内存,戴尔R740服务器获取cpu、内存、硬盘参数信息。
  10. Java获取文件路径获取访问路径、域名、项目名、请求入参
  11. .NET6之MiniAPI(十一):本地化
  12. 洛谷——P1001 A+B Problem
  13. android home 销毁 activity,android 触发home之后activity销毁问题
  14. 计算机法宝,计算机专业英语学习法宝.doc
  15. 厦门大学2019年数学分析考研试题
  16. 获取微信公众号文章内容
  17. Visual Studio + VAssistX常用快捷键
  18. 为什么选择高防DNS云解析?
  19. 详解重定向(HTTP状态码301/302/303/307/308)附案例
  20. 视界更宽阔,青橙 VOGA V 投影手机评测

热门文章

  1. Android Studio中新增文件夹并新建Activity时,编译后提示“程序包R不存在”解决
  2. 揭开IDC行业神秘面纱
  3. 数据库连接时的时区问题
  4. 推荐一款超强接口管理神器 Apifox
  5. [转帖]VB编程的七个优良习惯
  6. 2013年北京市零分高考作文 爱迪生接见中国移动互联网大佬 探讨手机未来发展...
  7. 用powershell完整输出计算机硬件信息
  8. 基于kali的域控环境搭建——黑盒测试环境搭建
  9. 微信小程序手写饼状图,非wx-echarts库,简洁易懂,不占代码体积!!!
  10. 数字藏品小程序 数字藏品怎么交易