距离变换

原创文章,转载请留言,注明出处

应用

距离变化于1966年被学者首次提出,目前被广泛应用于图像分析,计算机视觉,模式识别等领域,利用它来实现目标细化,骨架提取,形状插值及匹配,粘连物理的分离。

原理及实现方法

距离变换是针对二值图像的一种变换,这里的二值图像要确保1是目标像素,0是背景像素。变换的结果是灰度图像,每一点的灰度值代表该点距离目标像素的最小距离(棋盘距离),因此灰度值越小,距离目标像素越近。

对二值图像矩阵进行两次遍历,第一次从上到下,从左到右,利用下面左图的掩模,其中位置p是遍历的像素点。如果AL处的值不全为0,p不为0,则令 p=min(AL)+1 .第二次从下到上,从右到左,利用下面右图的掩模,若p不为0,BR不全为0,则取 p=min(min(BR)+1,p) 即取p和BR+1的最小值。


代码

利用MATLAB编写函数对任意输入图像进行距离变换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
function [ img2 ] = Dist_Tran_img( img )
%距离变换函数
[x, y] = size(img);
level = graythresh(img); %选择二值化最优阈值
img = im2bw(img,level); %图像二值化
img1 = zeros(x+2,y+2);
img1(1,2:y+1) = img(1,:); %将img扩大到(x+2*y+2)
img1(x+2,2:y+1) = img(x,:);
img1(2:x+1,1) = img(:,1);
img1(2:x+1,y+2) = img(:,y);
img1(2:x+1,2:y+1) = img(:,:);
img1(1,1) = img(1,1);
img1(x+2,1) = img(x,1);
img1(1,y+2) = img(1,y);
img1(x+2,y+2) = img(x,y);
tag = ones(x+2,y+2);
tag(2:x+1,2:y+1) = img;
for j=2:y+1
for i=2:x+1
if img1(i,j) ~= 0 && tag(i-1,j) ~= 1 && tag(i,j-1) ~= 1
img1(i,j) = min(img1(i-1,j),img1(i,j-1)) + 1;
tag(i,j) = 0;
continue;
end
if img1(i,j) ~= 0 && tag(i-1,j)~=1
img1(i,j) = img1(i-1,j) + 1;
tag(i,j) = 0;
continue;
end
if img1(i,j) ~= 0 && tag(i,j-1)~=1
img1(i,j) = img1(i,j-1) + 1;
tag(i,j) = 0;
end
end
end

for j=y+1:-1:2
for i=x+1:-1:2
if img1(i,j) ~= 0 && tag(i+1,j)~=1 && tag(i,j+1)~=1
if tag(i,j) == 0
img1(i,j) = min(min(img1(i+1,j),img1(i,j+1)) + 1,img1(i,j));
else
img1(i,j) = min(img1(i+1,j),img1(i,j+1)) + 1;
tag(i,j) = 0;
end
continue;
end
if img1(i,j) ~= 0 && tag(i+1,j)~=1
if tag(i,j) == 0
img1(i,j) = min(img1(i+1,j) + 1, img1(i,j));
else
img1(i,j) = img1(i+1,j) + 1;
tag(i,j) = 0;
end
continue;
end
if img1(i,j) ~= 0 && tag(i,j+1)~=1
if tag(i,j) == 0
img1(i,j) = min(img1(i,j+1) + 1, img1(i,j));
else
img1(i,j) = img1(i,j+1) + 1;
tag(i,j) = 0;
end
end
end
end
img2 = img1(2:x+1,2:y+1);
m = max(max(img2));
img2 = img2/m;
end

测试:原图和距离变换后的图像如下

MATLAB Tips: 如果灰度矩阵为double类型,则灰度范围是0-1,如果为unit或int型,则灰度范围为0-255,使用imshow(img)的时候需要注意,否则可能出现图像全黑或全白的情况。

Thank you for every coin~