matlab距离变换,图像处理之距离变换
图像处理之距离变换
概述
距离变换是一种计算像素间相对位置关系的数学方法,在二值图像处理和操作领域中具有重要地位,并在骨架提取以及图像窄化等场景中得到广泛应用。
通过变换处理后得到一个与原输入图像相似的灰度版本,在此过程中仅对前景区域的像素点赋予相应的灰度值
且越远离背景边缘的像素灰度值越大。
基本思想
根据度量距离的方法不同,距离变换有几种不同的方法,假设像素点p1(x1, y1),
p2(x2, y2)计算距离的方法常见的有:
1. 欧几里德距离,Distance =

2. 曼哈顿距离(City Block Distance),公式如下:Distance = |x2-x1|+|y2-y1|
3. 象棋格距离(Chessboard Distance),公式如下:Distance = max(|x2-x1|,|y2-y1|)
一旦选定距离度量公式,则可以在二值图像的距离变换中应用该方法。最常见的距离变换之一是
该算法采用连续进行腐蚀操作的方式实现目标效果,在腐蚀操作过程中设定停止条件的标准依据是当所有前景像素被彻底消除时
腐蚀的方法如下:通过这种方式,在基于时间顺序的基础上计算出各个前景像素点到前景中心骨架像素点的距离。
根据各个像素点计算出的距离值,并赋予相应的灰度等级。从而实现了二值图像的深度信息提取。
变换。
注意点:
腐蝏操作的 structural elements 的選擇會顯著影響-distance transform 的效果。其中采用了一個 3×3 matrix 作為示例,在實際應用中存在多種高效的算法
的距离变换算法,感兴趣的可以自己研究。
运行结果:

关键代码解析:
初始化二值图像,读取像素,获取前景边缘像素与背景边缘像素
以下是基于给定规则对原文的同义改写
@Override public BufferedImage filter(BufferedImage src, BufferedImage dest) { // calculate the distance here!! int index = 1; while (foregroundEdgePixels.size() > 0) { distanceSingleIteration(index); ++index; } // loop the each pixel and assign the color value according to distance value for (int row = 0; row < inputImage.getHeight(); row++) { for (int col = 0; col < inputImage.getWidth(); col++) { if(greyLevel[row][col] > 0) { int colorValue = (int)Math.round(greyLevel[row][col] * scaleValue + offsetValue); colorValue = colorValue > 255 ? 255 : ((colorValue < 0) ? 0 : colorValue); this.pixels2D[row][col] = colorValue; } } } // build the result pixel data at here !!! if ( dest == null ) dest = createCompatibleDestImage(inputImage, null ); index = 0; int[] outPixels = new int[width*height]; for(int row=0; row 60) { System.out.println("ddddd"); } index = row * width + col; tr = tg = tb = this.pixels2D[row][col]; ta = 255; outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb; } } setRGB( dest, 0, 0, width, height, outPixels ); return dest; }生成前景边缘像素与背景边缘像素的代码如下:
该方法用于清除前言边缘像素集合中的所有元素。
遍历行号从0到高度-1。
遍历列号从0到宽度-1。
当当前像素点的颜色与前景色不同时:
创建局部坐标点对象localPoint,并将其x轴设置为列索引值row。
创建局部坐标系偏移量k和l的取值范围为-1至+1。
检查局部邻域范围k从-1到+1以及l从-1到+1:
如果当前邻域像素的颜色不等于背景色:
或者已经记录过该局部点:
将此局部坐标点加入前言边点集合中。
该方法用于清除背景边缘像素集合。
调用clear函数清空背景边点集合中的所有元素。
遍历所有前言边缘像素点:
创建复制后的局部坐标对象localPoint2,并将其x轴设置为原始列索引值加上偏移量j,
y轴设置为原始行索引值加上偏移量i。
其中j的范围是从-1到+1,并且j必须满足大于等于0且小于宽度。
i的范围也是从-1到+1,并且i必须满足大于等于0且小于高度。
如果当前邻域像素的颜色与背景色相同,则将此复制后的局部位置入背景边点集合中。
