c# OpenCvSharp 距离变换 DistanceTransform

c# OpenCvSharp 距离变换 DistanceTransform

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

发表回复

您的电子邮箱地址不会被公开。