OpenCV 常用函数汇总(distanceTransform、minMaxLoc、resize、convertTo、threshold)

cv::distanceTransform

cv::distanceTransform 函数原型
 CV_EXPORTS_AS(distanceTransformWithLabels)
 void distanceTransform(
 InputArray src, //输入图像,数据类型为 CV_8U 的单通道图像
 OutputArray dst, //输出图像,与输入图像具有相同的尺寸,数据类型为 CV_8U 或 CV_32F 的单通道图像
 OutputArray labels, //二维的标签数组(离散 Voronoi 图),与输入图像具有相同的尺寸,数据类型为 CV_32S 的单通道数据
 int distanceType, //选择计算两个像素之间的距离方法的标志,其常用的距离度量方法在下方给出
 int maskSize, //距离变换掩码矩阵尺寸,参数可以选择的尺寸为 DIST_MASK_3(3x3)和 DIST_MASK_5(5x5)
 int labelType = DIST_LABEL_CCOMP //要构建的标签数组的类型
 );
  • distanceType
    DIST_USER    = -1,  //自定义距离
    DIST_L1      = 1,   //街区距离
    DIST_L2      = 2,   //欧式距离
    DIST_C       = 3,   //棋盘距离
    DIST_L12     = 4,   //
    DIST_FAIR    = 5,   //
    DIST_WELSCH  = 6,   //
    DIST_HUBER   = 7    //
  • labelType
    DIST_LABEL_CCOMP = 0, 输入图像中每个连接的 0 像素(以及最接近连接区域的所有非零像素)都将被分配为相同的标签
    DIST_LABEL_PIXEL = 1  输入图像中每个 0 像素(以及最接近它的所有非零像素)都有自己的标签

该函数用于实现图像的距离变换,即统计图像中所有像素距离 0 像素的最小距离。

  • 该函数的第一个参数为待距离变换的输入图像,输入图像要求必须是 CV_8U 的单通道图像。
  • 该函数的第二个参数是原始图像距离变换后的输出图像,与输入图像具有相同的尺寸,图像中每个像素值表示该像素在原始图像中距离 0 像素的最小距离。 由于图像的尺寸可能大于 256,因此图像中某个像素距离 0 像素的最近距离有可能会大于 255,为了能够正确地统计出每个像素距离 0 像素的最小距离,输出图像的数据类型可以选择 CV_8U 或者 CV_32F。
  • 该函数的第三个参数是原始图像的离散 Voronoi 图,输出图像是数据类型为 CV_32S 的单通道图像,图像尺寸与输入图像相同。
  • 该函数的第四个参数是距离变换过程中使用的距离种类,常用的距离为欧氏距离(DIST_L2)、街区距离(DIST_L1)和棋盘距离(DIST_C)。
  • 该函数的第五个参数是求取路径时候的掩码矩阵尺寸,该尺寸与选择的距离种类有着密切的关系,当选择使用街区距离时,掩码尺寸选择3x3还是5x5对计算结果没有影响,因此,为了加快函数运算速度,默认选择掩码矩阵尺寸为3x3; 当选择欧式距离时,掩码矩阵尺寸为3x3时是粗略地计算两个像素之间的距离,而当掩码矩阵尺寸为5x5时,精确地计算两个像素之间的距离,精确计算与粗略计算两者之间存在着较大的差异,因此,在使用欧式距离时,推荐使用5x5掩码; 当选择棋盘距离时,掩码矩阵尺寸对计算结果也没有影响,因此可以随意选择。
  • 该函数的最后一个参数为构建标签数组的类型。略
cv::distanceTransform 函数原型2
 CV_EXPORTS_W void distanceTransform(
 InputArray src,
 OutputArray dst,
 int distanceType,
 int maskSize,
 int dstType=CV_32F
 );
  • 该函数的最后一个参数是输出图像的数据类型,虽然可以在 CV_8U 和 CV_32F 两个类型中任意选择,但是图像输出时实际的数据类型与距离变换时选择的距离种类有着密切的联系, CV_8U 只能使用在计算街区距离的条件下,当计算欧式距离和棋盘距离时,即使参数设置为 CV_8U,实际输出的图像诗句类型也是 CV_32F。

由于 distanceTransform 函数是计算图像中非零像素距离 0 像素的最小距离,而图像中 0 像素表示黑色,因此,为看保证能够清楚地观察到距离变换的结果,不建议使用尺寸过小或者黑色区域较多的图像。

cv::minMaxLoc

cv::minMaxLoc 函数原型
 CV_EXPORTS_W void minMaxLoc(
 InputArray src, //需要寻找最大值和最小值的图像或者矩阵,要求必须是单通道矩阵
 CV_OUT double* minVal, //图像或者矩阵中的最小值
 CV_OUT double* maxVal = 0, //图像或者矩阵中的最大值
 CV_OUT Point* minLoc = 0, //图像或者矩阵中的最小值在矩阵中的坐标
 CV_OUT Point* maxLoc = 0, //图像或者矩阵中的最大值在矩阵中的坐标
 InputArray mask = noArray()
 );

cv::resize

cv::resize 函数原型
 CV_EXPORTS_W void resize(
 InputArray src, //输入图像
 OutputArray dst, //输出图像,图像的数据类型与 src 相同
 Size dsize, //输出图像的尺寸
 double fx = 0, //水平轴的比例因子,如果将水平轴变为原来的两倍,则赋值为2
 double fy = 0, //垂直轴的比例因子,如果将垂直轴变为原来的两倍,则赋值为2
 int interpolation = INTER_LINEAR //插值方法的标志
 );
  • interpolation
 INTER_NEAREST        = 0,  最近邻插值法
 INTER_LINEAR         = 1,  双线性插值法
 INTER_CUBIC          = 2,  双三次插值
 INTER_AREA           = 3,  使用像素区域关系重新采样,首选用于图像缩小,图像放大时效果与 INTER_NEAREST 相似
 INTER_LANCZOS4       = 4,  Lanczos 插值法
 INTER_MAX            = 7,  位精确双线性插值法
 WARP_FILL_OUTLIERS   = 8,  用掩码进行插值

cv::Mat::convertTo

cv::Mat::convertTo函数原型

该函数用来实现将已有图像转换成指定数据类型的图像

  • 第一个参数用于输出转换数据类型后的图像。
  • 第二个参数用于声明转换后图像的数据类型。
  • 第三个参数和第四个参数用于声明两个数据类型间的转换关系。
 void cv::Mat::convertTo(
 OutputArray m, //转换类型后输出的图像
 int rtype, //转换图像的数据类型
 double alpha=1, //转换过程中的缩放因子
 double beta=0 //转换过程中的偏置因子
 ) const;

cv::threshold

cv::threshold 函数原型
 CV_EXPORTS_W double threshold(
 InputArray src, //待二值化的图像,图像只能是 CV_8U 和 CV_32F 两种数据类型。对于图像通道数目的要求与选择的二值化方法相关
 OutputArray dst, //二值化后的图像,与输入图像具有相同的尺寸、数据类型和通道数
 double thresh, //二值化的阈值
 double maxval, //二值化过程的最大值,它只在 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 两种二值化方法中才使用
 int type //选择图像二值化的标志
 );

该函数是众多二值化 方法的集成,所有的方法都实现了一个功能,就是给定一个阈值,计算所有像素灰度值与这个阈值关系,得到最终的比较结果。
函数中有些阈值比较方法输出结果的灰度值并不是二值的,二是具有一个取值范围,不过为了体现其常用的功能,我们仍然称其为二值化函数或者阈值比较函数。

  • type
CV_THRESH_BINARY      =0,  灰度值大于阈值的为最大值,其他值为0
CV_THRESH_BINARY_INV  =1,  灰度值大于阈值的为0,其他值为最大值
CV_THRESH_TRUNC       =2,  灰度值大于阈值的为阈值,其他值不变
CV_THRESH_TOZERO      =3,  灰度值大于阈值的不变,其他值为0
CV_THRESH_TOZERO_INV  =4,  灰度值大于阈值的为0,其他值不变
CV_THRESH_MASK        =7,
CV_THRESH_OTSU        =8,
CV_THRESH_TRIANGLE    =16
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用`bitwise_or()`函数将两个二值化图像中像素值为255的位置合并到一个新的掩膜图像中,具体步骤如下: 1. 使用`inRange()`函数和`threshold()`函数分别对原始图像进行二值化处理,得到两个二值化图像。 2. 创建一个新的空白图像,大小与原始图像相同,并将所有像素值设置为0。 3. 使用`bitwise_or()`函数将两个二值化图像中像素值为255的位置合并到新图像中,像素值为255的位置表示两个二值化图像中像素值都为255的位置。 4. 最后,将新图像保存到磁盘上,即可得到包含两个二值化图像中像素值为255的掩膜图像。 下面是一个Python代码示例: ```python import cv2 # Load an image img = cv2.imread('image.png') # Convert the image to grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Apply inRange() function to get a binary image with pixels in a specified range binary1 = cv2.inRange(img, (0, 0, 0), (100, 100, 100)) # Apply threshold() function to get a binary image with pixels above a specified threshold ret, binary2 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # Create a new blank image of the same size mask = cv2.resize(binary1, (binary2.shape[1], binary2.shape[0])) # Combine the two binary images into one mask image mask = cv2.bitwise_or(binary1, binary2, mask=mask) # Save the new mask image cv2.imwrite('mask.png', mask) ``` 下面是一个C++代码示例: ```c++ #include <opencv2/opencv.hpp> using namespace cv; int main() { // Load an image Mat img = imread("image.png"); // Convert the image to grayscale Mat gray; cvtColor(img, gray, COLOR_BGR2GRAY); // Apply inRange() function to get a binary image with pixels in a specified range Mat binary1; inRange(img, Scalar(0, 0, 0), Scalar(100, 100, 100), binary1); // Apply threshold() function to get a binary image with pixels above a specified threshold Mat binary2; threshold(gray, binary2, 127, 255, THRESH_BINARY); // Create a new blank image of the same size Mat mask(binary2.rows, binary2.cols, CV_8UC1, Scalar(0)); // Combine the two binary images into one mask image bitwise_or(binary1, binary2, mask); // Save the new mask image imwrite("mask.png", mask); return 0; } ``` 在这个示例中,我们首先使用`inRange()`函数和`threshold()`函数分别对原始图像进行二值化处理,得到两个二值化图像。然后,我们创建了一个新的空白图像,大小与原始图像相同,并将所有像素值设置为0。接下来,我们使用`bitwise_or()`函数将两个二值化图像中像素值为255的位置合并到新图像中,像素值为255的位置表示两个二值化图像中像素值都为255的位置。最后,我们将新图像保存到磁盘上,即可得到包含两个二值化图像中像素值为255的掩膜图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值