距离变换的处理图像通常都是二值图像,而二值图像其实就是把图像分为两部分,即背景和物体两部分,物体通常又称为前景目标。通常我们把前景目标的灰度值设为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); } } }