当前位置:   article > 正文

欧式距离变换 EDT_chamfer distance 欧几里得距离

chamfer distance 欧几里得距离

零、建议阅读

文献 & 博客:

1. 李均利,陈爽,王秀英.三维欧氏距离变换快速算法[J].计算机辅助设计与图形学学报,2012,24(12):1559-1567. (适合一开始连概念都不懂的,只看介绍部分就行,算法不用看

2. 欧几里得距离转换(EDT)算法_distance transforms of sampled functions-CSDN博客

3. 图像距离变换_根据图像中的距离计算实际距离的算法或模型-CSDN博客

4. 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): 1-44. (特别推荐!

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

6. Felzenszwalb P F, Huttenlocher D P. Distance transforms of sampled functions[J]. Theory of computing, 2012, 8(1): 415-428.

7. 欧几里得距离转换(EDT)算法记录 - 知乎 (zhihu.com) (看6的文献时可以结合着一起看

代码:

1. euclidean-distance-transform-3d/python/edt.hpp at a38a2a0a434076baba6b43c1844649618f07c790 · seung-lab/euclidean-distance-transform-3d (github.com)

2.distance-transform-cuda/DistanceTransformCUDA.cu at master · 1danielcoelho/distance-transform-cuda (github.com)

3.maplibre-native/src/mbgl/util/tiny_sdf.cpp at 098dca8c5aaefa460e44d0a6643ff2dba1fd74e4 · maplibre/maplibre-native (github.com)


以下是个人笔记,没有顺序与逻辑。可能有错误,谨慎观看。


一、距离度量(distance metrics)

  1. 棋盘距离(D8)
  2. 城市街区距离(D4,又叫曼哈顿距离)
  3. 欧式距离
  4. 倒角距离(chamfer)(不知道这个放在这里对不对

倒角距离使用预先定义的距离模板来近似欧式距离,常见的倒角距离模板有3x3模板和5x5模板(对于2D图像来说,如果是3D图像则是3x3x3和5x5x5)。

倒角方法,具体可查看文献:

1. Shih F Y, Wu Y T. Fast Euclidean distance transformation in two scans using a 3× 3 neighborhood[J]. Computer Vision and Image Understanding, 2004, 93(2): 195-205. (2D的情况)

2. Svensson S, Borgefors G. Digital distance transforms in 3D images using information from neighbourhoods up to 5× 5× 5[J]. Computer Vision and Image Understanding, 2002, 88(1): 24-53. (3D的情况)

二、距离变换(distance transform, DT)算法

有很多方法,也有不同的分类方法。

1. 可以分为:iterative 和 sequential (or recursive),其中iterative可以并行,sequential不可以

2. 也可以大致分为:(这里的分类是not exclusive,即不是排它的)

  1. 有序传播算法(ordered propagation algorithm)
  2. 光栅扫描算法(raster scanning algorithm)
  3. 独立扫描算法(independent algorithm),也可以叫降维算法(dimensional reduction)

chamfer DT就是属于光栅扫描算法,不可并行。

三、独立扫描算法

如果是2D图像,则包含两部分:1st transformation, 2nd transformation。每个部分负责一个维度。详细内容去看”建议阅读“中的2,3,4.

独立扫描算法也有很多不同的方法,但每种方法的1st tranformation都是相同的。根据2nd tansformation的不同可以分为三种:

  1. based on parabola intersection (e.g. Satio's algorithm, Meijster's algorithm, Felzenszwalb‘s algorithm)
  2. based on mathmatical morphology
  3. based on Voronoi diagram intersections with image line (e.g. Maurer's algorithm)

四、尝试写的代码

1. chamfer DT

使用3x3x3的距离模板进行chamfer DT,语言matlab

  1. function F = edt(I,a,b,c)
  2. [nx,ny,nz] = size(I);
  3. F = inf(nx,ny,nz);
  4. F(I) = 0;
  5. F = padarray(F,[1 1 1],NaN,'both');
  6. % local distance matrix
  7. D = zeros(3,3,3);
  8. D([5,11,13,15,17,23]) = a;
  9. D([2,4,6,8,10,12,16,18,20,22,24,26]) = b;
  10. D([1,3,7,9,19,21,25,27]) = c;
  11. % foreward raster scan
  12. for z = 2:nz+1
  13. for y = 2:ny+1
  14. for x = 2:nx+1
  15. F(x,y,z) = min([F(x,y,z), ...
  16. D(1)+F(x-1,y-1,z-1),D(4)+F(x,y-1,z-1), D(7)+F(x+1,y-1,z-1), ...
  17. D(2)+F(x-1,y,z-1), D(5)+F(x,y,z-1), D(8)+F(x+1,y,z-1), ...
  18. D(3)+F(x-1,y+1,z-1),D(6)+F(x,y+1,z-1), D(9)+F(x+1,y+1,z-1) ...
  19. D(10)+F(x-1,y-1,z), D(13)+F(x,y-1,z), D(16)+F(x+1,y-1,z) ...
  20. D(11)+F(x-1,y,z)]);
  21. end
  22. end
  23. end
  24. % backward raster scan
  25. for z = nz+1:-1:2
  26. for y = ny+1:-1:2
  27. for x = nx+1:-1:2
  28. F(x,y,z) = min([F(x,y,z), ...
  29. D(17)+F(x+1,y,z), ...
  30. D(12)+F(x-1,y+1,z), D(15)+F(x,y+1,z), D(18)+F(x+1,y+1,z), ...
  31. D(19)+F(x-1,y-1,z+1), D(22)+F(x,y-1,z+1), D(25)+F(x+1,y-1,z+1), ...
  32. D(20)+F(x-1,y,z+1), D(23)+F(x,y,z+1), D(26)+F(x+1,y,z+1), ...
  33. D(21)+F(x-1,y+1,z+1), D(24)+F(x,y+1,z+1), D(27)+F(x+1,y+1,z+1)]);
  34. end
  35. end
  36. end
  37. F = F(2:end-1,2:end-1,2:end-1);
  38. end

2. Saito方法

对2D binary图像I进行欧式距离变换,语言matlab

ps1: 参考 github 1danielcoelho/distance-transform-cuda (他说Meijster方法,但其实还是Saito方法

ps2: F是平方距离,I是2D binary image

  1. function F = edt(I)
  2. % nx(width), ny(height)
  3. [height,width] = size(I);
  4. % N (infinity)
  5. N = width * height + 1;
  6. % first phase
  7. G = zeros(size(I));
  8. for i = 1:width
  9. % Initialize val to either 0 or 'infinity'
  10. val = (1 - I(1,i)) * N;
  11. G(1,i) = val;
  12. % scan 1
  13. for j = 2:height
  14. val = (1 - I(j,i))*(1+val);
  15. G(j,i) = val;
  16. end
  17. % scan 2
  18. for j = height-1:-1:1
  19. if G(j,i) > val
  20. G(j,i) = 1+val;
  21. end
  22. val = G(j,i);
  23. end
  24. end
  25. % second phase
  26. F = G;
  27. x = 1:width;
  28. for j = 1:height
  29. for i = 1:width
  30. F(j,i) = min((x-i).*(x-i)+G(j,:).*G(j,:));
  31. end
  32. end
  33. end

3. Felzenszwalb方法

(该方法据说是目前最好的),对2D binary图像进行欧式距离变换,语言matlab

ps: 参考 github maplibre-native

  1. function G = edt(I)
  2. [height,width] = size(I);
  3. G = zeros(size(I));
  4. G(~I) = height*width+1;
  5. % col
  6. for x = 1:width
  7. f = G(:,x);
  8. d = edt1d(f,height);
  9. G(:,x) = d;
  10. end
  11. % row
  12. for y = 1:height
  13. f = G(y,:);
  14. d = edt1d(f,width);
  15. G(y,:) = d;
  16. end
  17. end
  18. function d = edt1d(f,n)
  19. d = zeros(1,n);
  20. v = zeros(1,n);
  21. z = zeros(1,n+1);
  22. v(1) = 1;
  23. z(1) = -inf;
  24. z(2) = inf;
  25. k = 1;
  26. for q = 2:n
  27. s = ((f(q) + q * q) - (f(v(k)) + v(k) * v(k))) / (2 * q - 2 * v(k));
  28. while (s <= z(k))
  29. k = k-1;
  30. s = ((f(q) + q * q) - (f(v(k)) + v(k) * v(k))) / (2 * q - 2 * v(k));
  31. end
  32. k = k+1;
  33. v(k) = q;
  34. z(k) = s;
  35. z(k+1) = inf;
  36. end
  37. k = 1;
  38. for q = 1:n
  39. while (z(k+1)<q), k = k+1; end
  40. d(q) = (q - v(k))*(q - v(k)) + f(v(k));
  41. end
  42. end

2024.6.22

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/793947
推荐阅读
相关标签
  

闽ICP备14008679号