距离变换的处理图像通常都是二值图像,而二值图像其实就是把图像分为两部分,即背景和物体两部分,物体通常又称为前景目标。通常我们把前景目标的灰度值设为255(即白色),背景的灰度值设为0(即黑色)。所以定义中的非零像素点即为前景目标,零像素点即为背景。所以图像中前景目标中的像素点距离背景越远,那么距离就越大,如果我们用这个距离值替换像素值,那么新生成的图像中这个点越亮。
1、欧式距离:表示距离小于等于某一个值的像素中心(x,y)且半径为R的圆平面。
![]()
2、棋盘距离:数字栅格上像素按照对角线方向移动形成的距离。
![]()
3、曼哈顿距离:从起点到终点所需要的最小步数,只允许横向移动和纵向移动。


using OpenCvSharp;
using OpenCvSharp.Extensions;
using DlibDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace app
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
/// <summary>
/// 距离变换
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDistanceTransform_Click(object sender, EventArgs e)
{
Mat src = Cv2.ImRead(@"img\star.png");
Cv2.ImShow("原图", src);
Mat tran = new Mat();
Mat normalize = new Mat();
// 灰度转换
Mat gray = new Mat();
Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
/*
OpenCV中,函数distanceTransform()用于计算图像中每一个非零点像素与其最近的零点像素之间的距离,
输出的是保存每一个非零点与最近零点的距离信息,图像上越亮的点,代表了离零点的距离越远。
用途:
可以根据距离变换的这个性质,经过简单的运算,用于细化字符的轮廓和查找物体质心(中心)。
*/
/*
距离变换的处理图像通常都是二值图像,而二值图像其实就是把图像分为两部分,即背景和物体两部分,物体通常又称为前景目标。
通常我们把前景目标的灰度值设为255(即白色),背景的灰度值设为0(即黑色)。
所以定义中的非零像素点即为前景目标,零像素点即为背景。
所以图像中前景目标中的像素点距离背景越远,那么距离就越大,如果我们用这个距离值替换像素值,那么新生成的图像中这个点越亮。
*/
//User:用户自定义
//L1: 曼哈顿距离
//L2: 欧式距离
//C: 棋盘距离
// 距离变换
//Cv2.DistanceTransform(matGray, dist, DistanceTypes.L2, DistanceTransformMasks.Mask3);
// 按位运算 取反
Cv2.BitwiseNot(gray, gray);
Cv2.ImShow("按位运算 取反", gray);
// 距离变换
Cv2.DistanceTransform(gray, tran, DistanceTypes.L2, DistanceTransformMasks.Mask3);
Cv2.ImShow("距离变换", tran);
// 归一化
Cv2.Normalize(tran, normalize, 0, 1, NormTypes.MinMax);
Cv2.ImShow("归一化", normalize);
}
}
}