美文网首页
C#:OpenCvSharp 距离变换

C#:OpenCvSharp 距离变换

作者: 大龙10 | 来源:发表于2023-12-19 14:11 被阅读0次

距离变换的处理图像通常都是二值图像。

一、背景和物体

  • 二值图像其实就是把图像分为两部分,即背景和物体两部分,物体通常又称为前景目标。
  • 通常我们把前景目标的灰度值设为255(即白色),背景的灰度值设为0(即黑色)。

二、距离值替换像素值

  • 所以定义中的非零像素点即为前景目标,零像素点即为背景。
  • 所以图像中前景目标中的像素点距离背景越远,那么距离就越大。
    如果我们用这个距离值替换像素值,那么新生成的图像中这个点越亮。

三、三种距离

  • 1、欧式距离:
    表示距离小于等于某一个值的像素中心(x,y)且半径为R的圆平面。
    D[(x_1,y_1),(x_2,y_2)]=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}

  • 2、棋盘距离:
    数字栅格上像素按照对角线方向移动形成的距离。
    D[(x_1,y_1),(x_2,y_2)]=max(|x_1-x_2|,|y_1-y_2|)

  • 3、曼哈顿距离:
    从起点到终点所需要的最小步数,只允许横向移动和纵向移动。
    D[(x_1,y_1),(x_2,y_2)]=|x_1-x_2|+|y_1-y_2|

四、函数distanceTransform()

  • OpenCV中,函数distanceTransform()用于计算图像中每一个非零点像素与其最近的零点像素之间的距离,
    输出的是保存每一个非零点与最近零点的距离信息,图像上越亮的点,代表了离零点的距离越远。
  • 用途:
    可以根据距离变换的这个性质,经过简单的运算,用于细化字符的轮廓和查找物体质心(中心)。
    L1: 曼哈顿距离
    L2: 欧式距离
    C: 棋盘距离

五、程序

        private void button4_Click(object sender, EventArgs e)
        {
            
            Mat src = src_img.Clone(); 
            Cv2.ImShow("原图", src);
            Mat tran = new Mat();
            Mat normalize = new Mat();
            // 灰度转换
            Mat gray = new Mat();
            Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);

            Cv2.BitwiseNot(gray, gray);
            Cv2.ImShow("按位运算 取反", gray);
            // 距离变换
            Cv2.DistanceTransform(gray, tran, DistanceTypes.L2, DistanceMaskSize.Mask3);
            Cv2.Normalize(tran, normalize, 0, 1, NormTypes.MinMax);

            normalize.ConvertTo(dst, MatType.CV_8U, 256);
            Cv2.ImShow("归一化", dst);
            //pictureBox1.Image = dst.ToBitmap();
        }

运行结果

六、资料

蒋智昊的博客
http://chanpinxue.cn/archives/5118.html

相关文章

网友评论

      本文标题:C#:OpenCvSharp 距离变换

      本文链接:https://www.haomeiwen.com/subject/pmxwgdtx.html