1.0 通过距离变换可以得到什么?



2.0 什么是距离?

满足以下三个条件的函数D称作距离:
(1)同一性:
(2)对称性:
(3)三角不等式:

3.0 距离变换

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

4.0 掩模计算

掩模运算,又称图像掩模(Image Masking),指用选定的图像、图形或物体,对待处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。

用于覆盖的特定图像或物体称为掩模或模板。

数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。

数字图像处理中,图像掩模主要用于:
①提取感兴趣区(ROI,Region Of Interest),用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。

②屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。

③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。

④特殊形状图像的制作。

通俗地说掩摸运算的目的就是在对遥感影像进行局部处理前通过模板运算将不参加处理的区域掩盖起来,便于之后对感兴趣区域的处理,同时保证不参加处理的区域的信息不受影响。

4.1 掩膜运算

以图和掩膜的与运算为例:
原图中的每个像素和掩膜中的每个对应像素进行与运算。比如1 & 1 = 1;1 & 0 = 0;
比如一个3 * 3的图像与3 * 3的掩膜进行运算,得到的结果图像就是

void cvDistTransform( const CvArr* src, CvArr* dst, int distance_type=CV_DIST_L2,  int mask_size=3, const float* mask=NULL );

src
输入 8-比特、单通道 (二值) 图像.
dst
含计算出的距离的输出图像(32-比特、浮点数、单通道).
distance_type
距离类型; 可以是 CV_DIST_L1, CV_DIST_L2, CV_DIST_C 或 CV_DIST_USER.

mask_size
距离变换掩模的大小,可以是 3 或 5. 对 CV_DIST_L1 或 CV_DIST_C 的情况,参数值被强制设定为 3, 因为 3×3 mask 给出 5×5 mask 一样的结果,而且速度还更快。

mask
用户自定义距离距离情况下的 mask。
在 3×3 mask 下它由两个数(水平/垂直位量,对角线位移量)组成,
5×5 mask 下由三个数组成(水平/垂直位移量,对角位移和 国际象棋里的马步(马走日))

函数 cvDistTransform 二值图像每一个象素点到它最邻近零象素点的距离。对零象素,函数设置 0 距离,对其它象素,它寻找由基本位移(水平、垂直、对角线或knight’s move,最后一项对 5×5 mask 有用)构成的最短路径。

全部的距离被认为是基本距离的和。
由于距离函数是对称的,所有水平和垂直位移具有同样的代价 (表示为 a ), 所有的对角位移具有同样的代价 (表示为 b), 所有的 knight’s 移动具有同样的代价 (表示为 c).

对类型 CV_DIST_C 和 CV_DIST_L1,距离的计算是精确的,而类型 CV_DIST_L2 (欧式距离) 距离的计算有某些相对误差 (5×5 mask 给出更精确的结果), OpenCV 使用 [Borgefors86] 推荐的值:
CV_DIST_C (3×3):
a=1, b=1

CV_DIST_L1 (3×3):
a=1, b=2

CV_DIST_L2 (3×3):
a=0.955, b=1.3693

CV_DIST_L2 (5×5):
a=1, b=1.4, c=2.1969

参考:https://blog.csdn.net/LJH0600301217/article/details/8679566

没看懂~

https://zhuanlan.zhihu.com/p/38917770

欧氏距离变换

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

距离变换是计算并标识空间点(对目标点)距离的过程,它最终把二值图像变换为灰度图像(其中每个栅格的灰度值等于它到最近目标点的距离)。

在二值图像中,1代表目标点,0代表背景;
在灰度图像中,栅格的灰度值表示该栅格点到最近目标点的距离值。

这样一张M×N的图像可以表示为一个二维数组A[M][N],其中A[i][j]=1对应的栅格表示目标点,A[i][j]=0对应的栅格表示背景点。

设B={(x,y)|A[i][j]=1}为目标点集合,则欧氏距离变换就是对A中所有的栅格点求:

从而得到二值图像A的欧氏距离变换图。

随着应用的需要,已经有多种EDT算法。按变换方式分,这些算法可以分为:基于目标点变换算法和基于背景点变换算法,其中基于目标点变换算法又可分为:传播算法、光栅扫描算法和独立扫描算法

参考:百度百科

论文

欧式距离变换Euclidean Distance Transform是把二值图转换成灰度图的方法。给定一张二值图,每个元素只能取值0或1,我们把值为0的点称作背景点,值为1的点称为目标点。那么对二值图进行EDT变换后,目标点X的值变成:

其中Bx是距离X最近的背景点。

对于如何有效计算二值图像的signed euclidean distance,可以参考这篇文章:

[1] Fabbri R, Costa L D F, Torelli J C, et al. 2D Euclidean distance transform algorithms: A comparative survey[J]. ACM Computing Surveys (CSUR), 2008, 40(1): 2.

[2] Meijster A, Roerdink J B T M, Hesselink W H. A general algorithm for computing distance transforms in linear time[M]//Mathematical Morphology and its applications to image and signal processing. Springer US, 2000: 331-340.

[3] Felzenszwalb P F, Huttenlocher D P. Distance Transforms of Sampled Functions[J]. Theory of computing, 2012, 8(1): 415-428.

具体的算法

参考:https://blog.csdn.net/tianwaifeimao/article/details/45078661

  1. Saito的算法:

  2. Maurer的算法对Saito改进:
    第一步中的1-D Transformaion是一样的。只不过由先行后列改为先列后行。

第二步的改进基于一个事实:

对于每一列来说,并不是所有的sites(背景)都对Distance Map起到关键作用,而仅仅取决于与这一行有交集的VR,这里用到VR的概念。


一些基本定义:

背景点为0,黑色,为感兴趣点,Voronioi elements,sites;

前景点为1:白色;

VR:某一背景点的VR指的前景点集合,这些前景点到此背景点的距离比到其他背景点距离都要短。

VS:某一前景点的VS指的是背景点的集合,这些背景点到此前景点距离比到其他前景点距离都要短。


  1. Felzenszwalb算法[3]

城市街区距离D4距离变换

https://zhuanlan.zhihu.com/p/38917770

它定义为在只允许横向和纵向运动的情况下,从起点到终点的移动步数。用公式表示为

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

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

棋盘距离D8

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


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

欧式距离(EDT)的matlab和C代码

https://www.cnblogs.com/darkknightzh/p/4342195.html

% 下面的为欧式距离变换的代码
function Dr = mybwdist(binaryimg)
[height, width]=size(binaryimg);
D=[];
for  k = 1: width   % 由于matlab按列存储,所以内层遍历行,外层遍历列。D=[D calcFirstPassD1(binaryimg(:,k), height)];
end Dr=processDimN([height, width], D); endfunction D=calcFirstPassD1(I, vectorLength)
D1=zeros(vectorLength,1);%     // Initialize D1 - Feature points get set to zero, -1 otherwise
%     D1(i) = (I(col*nrows+i) == 1) ? 0.0f : -1.0f;
D1(I==0)= (-1);%     // Process column
D=voronoiEDT(D1);  endfunction D=voronoiEDT(D)%     // Note: g and h are working vectors allocated in calling function
[ns, g, h] = constructPartialVoronoi(D);
if ns == -1return;
endD=queryPartialVoronoi(g, h, ns, D);end function [el, g, h]=constructPartialVoronoi(D)
%     //
%     // Construct partial voronoi diagram (see Maurer et al., 2003, Fig. 5, lines 1-14)
%     // Note: short variable names are used to mimic the notation of the paper
%     //
g=zeros(1,length(D));
h=zeros(1,length(D));
el = -1;
for k = 0:length(D)-1   % 在matlab中对应数组的高度fk = D(k+1);if fk ~= -1if (el < 1)el=el+1;g(el+1) = fk;h(el+1) = k;else while ( (el >= 1) && RemoveEDT(g(el), g(el+1), fk, h(el), h(el+1), k))el=el-1;end  el=el+1;g(el+1) = fk;h(el+1) = k;endend
endendfunction res = RemoveEDT(du, dv, dw, u, v, w)
a = v - u;
b = w - v;
c = w - u;%     // See Eq. 2 from Maurer et al., 2003
res=(c * dv - b * du - a * dw) > (a * b * c);
endfunction D=queryPartialVoronoi(g, h, ns, D)%     //
%     // Query partial Voronoi diagram (see Maurer et al., 2003, Fig. 5, lines 18-24)
%     //
el = 0;
for k = 0:length(D)-1while ( (el < ns) && ((g(el+1) + ((h(el+1) - k)*(h(el+1) - k))) > (g(el+2) + ((h(el+2) - k)*(h(el+2) - k)))) ) el=el+1;endD(k+1) = g(el+1) + (h(el+1) - k)*(h(el+1) - k);
end
endfunction D3=processDimN(dims, D)
%     // Create temporary vectors for processing along dimension N
D3=[];
for k = 0 : dims(1)-1         % // 若为二维数组,则得到第一维元素总数,即行数。注意,matlab按列存储,C按行存储。
% // Generate indices to points along vector pathD3=[D3;voronoiEDT(D(k+1,:))];
end
end



matlab中处理

https://ww2.mathworks.cn/help/images/ref/bwdist.html

[D,idx] = bwdist(BW,method)

【车道线检测与寻迹】4月20 欧式、4D、8D、方向倒角距离ODT距离变换相关推荐

  1. 【车道线检测与寻迹】LSD、LBD快速直线检测

    python应用LSD opencv 这个LSD https://github.com/primetang/pylsd是封装好的,不知道哪儿改参数,原始的LSD检测前会将图片缩小至80%,当图片很小是 ...

  2. CVPR 2022 3月7日论文速递(17 篇打包下载)涵盖 3D 目标检测、医学影像、图像去模糊、车道线检测等方向

    CVPR2022论文速递系列: CVPR 2022 3月3日论文速递(22 篇打包下载)涵盖网络架构设计.姿态估计.三维视觉.动作检测.语义分割等方向 CVPR 2022 3月4日论文速递(29 篇打 ...

  3. 鲁汶大学提出可端到端学习的车道线检测算法

    点击我爱计算机视觉标星,更快获取CVML新技术 近日,比利时鲁汶大学提出基于可微最小二乘拟合的端到端车道线检测算法,使该任务的学习过程不再割裂,实现整体的系统最优化. 该文作者信息: 背景 众所周知, ...

  4. 通用汽车研发中心最新提出:3D车道线检测新方法

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作分享,不代表本公众号立场,侵权联系删除 转载于:知乎黄浴博士,已获授权 https://zhuanlan.zhi ...

  5. 基于MATLAB改进Otsu阈值分割的车道线检测

    基于MATLAB改进Otsu阈值分割的车道线检测 摘要:在判断车道偏离以防止车辆碰撞等危害时,车道标线检测需要通过图像处理来进行,检测方法是否适用于各种背景环境条件以及检测的及时性至关重要传统的Ots ...

  6. 毫米波与视觉融合及车道线检测视频分享

    毫米波与视觉融合及车道线检测视频分享 微信公众号:幼儿园的学霸 个人的学习笔记,关于OpenCV,关于机器学习, -.问题或建议,请公众号留言; ADAS项目基本就要结束了,今天将项目中的部分结果视频 ...

  7. 3D车道线检测:Gen-LaneNet

    3D车道线检测:Gen-LaneNet Gen-LaneNet: A Generalized and Scalable Approach for 3D Lane Detection 论文链接:http ...

  8. 车道线检测算法经典编程

    车道线检测算法经典编程 车道线曲线拟合算法编程 计算经过(50,50),(90,120),(70,200)三点的Catmull_Rom样条曲线. IplImage* img = cvCreateIma ...

  9. 【camera】全景驾驶感知网络YOLOP部署与实现(交通目标检测、可驾驶区域分割、车道线检测)

    全景驾驶感知网络YOLOP部署与实现(交通目标检测.可驾驶区域分割.车道线检测) 项目下载地址 包含C++和Python两种版本的程序实现:下载地址 YOLOP开源项目: https://github ...

  10. 【camera】自动驾驶感知系统实现(车道线检测和拟合、目标检测与跟踪、道路可行驶区域分割、深度估计、图像视野到BEV空间映射、像平面到地平面映射)

    自动驾驶感知系统实现(车道线检测和拟合.目标检测与跟踪.道路可行驶区域分割.深度估计.图像视野到BEV空间映射.像平面到地平面映射) 项目下载地址:项目下载地址 推理引擎下载地址:推理引擎下载地址 支 ...

最新文章

  1. 初学Node(五)文件I/O
  2. 内存位置访问无效 midas.dll_java并发之内存模型
  3. 2-27 最短路径《啊哈算法》2-28完成四种算法
  4. 面试题:左旋转字符串
  5. 奥南朵 | 21天提升幸福感正念冥想
  6. 结构体中函数应该怎样定义才能返回值_15 函数的基本使用
  7. SpringBoot入门 2
  8. windows下OpenGL开发前准备
  9. 计算机模板是什么意思,Office
  10. 建模助手 —『 CAD图层管理 』Revit视图干净清爽
  11. Vrep学习笔记(一)
  12. size of的用法总结
  13. 用谷歌浏览器模拟打开天眼查网站并爬取需要的数据
  14. TLC5615模数转换锯齿波仿真实验(Arduino)
  15. 中文情感极性词典 NTUSD
  16. uwb定位与蓝牙定位成本对比分析
  17. 《后盾网Thinkphp5博客项目实战》最全
  18. 快速神经网络的训练算法LARS/LAMB工作原理 --UC Berkeley在读博士生尤洋
  19. 浅入浅出Caffeine cache
  20. 利用迈克尔逊干涉仪和傅里叶变换光谱法测量相干性

热门文章

  1. 基于FVC_MSAVI_EVI的荒漠化等级分类方法
  2. matlab连续投影算法SPA使用示例
  3. Flutter之CupertinoSwitch和Switch开关组件的简单使用
  4. Android自定义 view之图片裁剪从设计到实现
  5. Android-Universal-Image-Loader学习笔记(一)
  6. android AChartEnginee讲解之源码框架解读
  7. 豆瓣9.3的高分! 牛逼的Git !!!
  8. 30岁的程序员:不拼体力的我们应该关注什么?
  9. 17年,寻找出路的一年
  10. 为什么我们总觉得别人掌握的技术总是牛叉的?