📜  OpenCV-距离转换(1)

📅  最后修改于: 2023-12-03 15:18:07.524000             🧑  作者: Mango

OpenCV 距离转换

OpenCV 是一个开源的计算机视觉库,其中包含了多种图像和视频处理工具,例如模板匹配、边缘检测、图像识别等等。其中,距离转换是一种常用的图像处理方式。

什么是距离转换

距离转换是将图像中的像素点与其他像素点之间的距离转换为一个新的图像。这个距离可以是欧几里得距离、曼哈顿距离、切比雪夫距离等等。距离转换通常用于图像分割、轮廓检测、形状匹配等方面。

距离转换的实现

在 OpenCV 中,可以使用 cv::distanceTransform 函数来实现距离转换。该函数的定义如下:

void cv::distanceTransform(
    cv::InputArray src,  // 输入图像
    cv::OutputArray dst, // 输出图像
    int distanceType,    // 距离类型
    int maskSize,        // 距离计算卷积核尺寸
    int dstType,         // 输出类型
    cv::OutputArray mask,// 可选的输出距离图像计算掩码
    int borderType       // 可选的边界处理方式
);

其中的参数含义如下:

  • src:输入图像,灰度图像;
  • dst:输出图像,距离图像,单通道浮点型图像;
  • distanceType:距离类型,包括 DIST_L1DIST_L2DIST_CDIST_L12DIST_FAIRDIST_WELSCH,分别表示曼哈顿距离、欧几里得距离、切比雪夫距离、L1-L2 距离、Fair 偏差函数距离和 Welsch 偏差函数距离,默认为 DIST_L2
  • maskSize:距离计算卷积核尺寸,可以为 3、5 或 7,默认为 3;
  • dstType:输出类型,可以为 CV_8UC1CV_32FC1,默认为 CV_32FC1
  • mask:可选的输出距离图像计算掩码,用于计算局部距离,在不需要时可以设置为 cv::noArray()
  • borderType:可选的边界处理方式,可以选择使用默认值(cv::BORDER_DEFAULT)或其他处理方式,例如 cv::BORDER_CONSTANTcv::BORDER_REFLECTcv::BORDER_WRAP

以下是一个使用 cv::distanceTransform 函数计算欧几里得距离的例子:

#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
    Mat src = imread("input.png", IMREAD_GRAYSCALE);
    if (src.empty())
    {
        cerr << "Error: loading image failed\n";
        return -1;
    }

    Mat dst;
    distanceTransform(src, dst, DIST_L2, 3, CV_32FC1);

    imshow("Input", src);
    imshow("Distance Transform", normalize(dst, 0, 1, NORM_MINMAX));
    waitKey();
    return 0;
}

在上面的例子中,我们在输入图像上执行了欧几里得距离转换,并将结果图像进行了归一化处理后显示出来。

总结

距离转换是一种非常有用的图像处理技术,可以用于很多应用中。在 OpenCV 中,使用 cv::distanceTransform 函数可以十分方便地实现距离转换,我们可以根据具体需求选择不同的距离类型、距离计算卷积核尺寸和输出类型等参数。