美文网首页深度学习-推荐系统-CV-NLP
数字图像的距离变换算法

数字图像的距离变换算法

作者: 史哲涵 | 来源:发表于2019-11-05 06:44 被阅读0次

image

一、图像数字化

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

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

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

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

二、距离

满足以下三个条件的函数D称作距离

(1)同一性:

image

(2)对称性:

image

(3)三角不等式:

image

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

欧式距离****DE就是通常所说的距离,它定义为

image

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

城市街区距离****D****4,它定义为在只允许横向和纵向运动的情况下,从起点到终点的移动步数。用公式表示为

image

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

如果允许横向、纵向和沿对角线方向移动,则可以得到棋盘距离D8的定义

image

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

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

三、距离变换

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

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

image

图1:输入图像

image

图2:D4距离下距离变换结果

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

image

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

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

2、利用掩模1(mask1),左上角开始,从左往右,从上往下遍历数组,将掩模中P点对应的元素的值作如下更新:

image

3、利用掩模2(mask2),右下角开始,从右往左,从下往上遍历数组,将掩模中P点对应的元素的值作如下更新:

image

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

这个算法过程在图像编边界需要做出调整,因为在边界处,掩模不能全部覆盖图像,这时可以将掩模中没有对应元素的位置的值当作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;D_4距离:DIST_L1 = 1;D_8距离:DIST_C = 3等);

  • int mask_size:距离变换掩模的大小,一般为3或5;

  • int dstType:输出图像的数据类型,可以为CV_8U或CV_32F。

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

效果如下图所示:

image

欧式距离下的距离变换

image

D4距离下的距离变换

image

D8距离下的距离变换

下面是代码实现:

#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调换,使得原点距离为0
    mat = 1 - mat;

    //显示原始图像(显示为黑色)
    imshow("原始图片", mat);

    //分别利用欧式距离、D4距离和D8距离作距离变换,将结果存入transMatD4、transMatD8和transMatE
    distanceTransform(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;
}

相关文章

  • 数字图像的距离变换算法

    一、图像数字化 通过传感器获得的图像是平面坐标(x,y)的连续函数f(x,y),它的值图像对应位置的亮度。为了能够...

  • 图像增强整理

    功能与算法对应表 参考文档 灰度变换——反转,对数变换,伽马变换,灰度拉伸,灰度切割,位图切割 《数字图像处理》(...

  • 【图像处理】OpenCV系列二十六 --- 图像分割(grabC

    上一节我们学习了距离变换算法,相信大家学习之后,对距离变换算法已经有了基本的认识,本节呢,我们对学习图像分割,对g...

  • 三、图像直方图变换和几何变换

    直方图变换 灰度变换 点运算 几何变换 直方图变换 1.灰度直方图 灰度直方图:数字图像中每一灰度级像素出现的频次...

  • 隐写术(二)--传统数字图像隐写算法

    数字图像隐写算法根据不同的标准而有不同的分类。下面重要根据隐写算法的工作域和隐写算法的适用范围来展开数字图像隐写算...

  • 距离变换

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

  • python skimage图像处理(三)

    本文转自 python数字图像处理 霍夫线变换 在图片处理中,霍夫变换主要是用来检测图片中的几何形状,包括直线、圆...

  • 5、二维离散傅里叶变换

    1、概念 令 表示一幅大小为 像素的数字图像,其中 。其二维离散傅里叶变换(DFT)为离散傅里叶反变换(IDF...

  • OpenCV+Python 频域分析

    参考: opencv-python官方文档《刚萨雷斯数字图像处理(MATLAB版)》 图像处理中的傅里叶变换 二维...

  • 数字图像处理(灰度变换)

    文|抽象转移 以下变换都是基于空间域上进行的,频率域上的处理后面再展开来写。 所谓空间域,即把图像看作是M*N大小...

网友评论

    本文标题:数字图像的距离变换算法

    本文链接:https://www.haomeiwen.com/subject/slojbctx.html