出处:桑卡, 《图像处理分析与机器视觉》
计算全局图像中各个像素点对子图像的距离。
AL | AL |
AL | P |
AL |
Mask 1
BR | |
P | BR |
BR | BR |
Mask 2
1. 将图像进行二值化,子图像值为0,背景为255;
2. 利用Mask 1从左向右,从上到下扫描,p点是当前像素点,q点是Mask 1中AL邻域中的点,D()为距离计算,包括棋盘距离、城市距离和欧式距离。F(p)为p点的像素值,计算
F(p) = min( F(p), F(q)+D(p,q) ), 其中,q属于AL.
3. 再利用Mask 2从右向左,从下向上扫描,计算
F(p) = min( F(p), F(q)+D(p,q) ), 其中,q属于BR
4. F(p) 则为距离变换后的图像。
代码如下,基于OpenCV 2.4
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "math.h"
#include <stdio.h>
using namespace cv;
Mat& DistTran(Mat& I);
Mat& NormImage(Mat& I);
static float Round(float f)
{
return ( ceil(f)-f > f-floor(f) ) ? floor(f) : ceil(f);
}
int ChessBoardDist