OpenCV(cv::minMaxLoc())



cv::minMaxLoc() 是 OpenCV 库中用于查找数组或图像中最小值和最大值及其位置的函数。



1. 函数定义

void cv::minMaxLoc(
    InputArray src,
    double* minVal = nullptr,
    double* maxVal = nullptr,
    Point* minLoc = nullptr,
    Point* maxLoc = nullptr,
    InputArray mask = noArray()
)

参数:

  • src: 输入数组,可以是单通道或多通道的 CV_8UCV_32FCV_64F 类型的图像或矩阵。

  • minVal: 指向 double 类型变量的指针,用于存储找到的最小值。如果不需要最小值,可以传入 nullptr

  • maxVal: 指向 double 类型变量的指针,用于存储找到的最大值。如果不需要最大值,可以传入 nullptr

  • minLoc: 指向 Point 类型变量的指针,用于存储最小值的位置(坐标)。如果不需要位置,可以传入 nullptr

  • maxLoc: 指向 Point 类型变量的指针,用于存储最大值的位置(坐标)。如果不需要位置,可以传入 nullptr

  • mask: 可选的掩膜数组,类型必须与 src 相同。如果提供了掩膜,则函数只会在掩膜非零的区域内查找最小值和最大值。默认情况下,掩膜为全1,即整个输入数组都参与查找。

返回值:

cv::minMaxLoc() 没有返回值,结果通过指针参数返回。



2. 示例代码

以下是一个使用 cv::minMaxLoc() 函数的示例,展示如何在灰度图像中查找最小值和最大值及其位置:

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
    // 读取灰度图像
    cv::Mat img = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
    if (img.empty())
    {
        std::cerr << "无法读取图像文件!" << std::endl;
        return -1;
    }

    double minVal, maxVal;
    cv::Point minLoc, maxLoc;

    // 查找最小值和最大值及其位置
    cv::minMaxLoc(img, &minVal, &maxVal, &minLoc, &maxLoc);

    std::cout << "最小值: " << minVal << " 位置: (" << minLoc.x << ", " << minLoc.y << ")" << std::endl;
    std::cout << "最大值: " << maxVal << " 位置: (" << maxLoc.x << ", " << maxLoc.y << ")" << std::endl;

    // 可视化最小值和最大值的位置
    cv::Mat imgColor;
    cv::cvtColor(img, imgColor, cv::COLOR_GRAY2BGR);
    cv::circle(imgColor, minLoc, 5, cv::Scalar(255, 0, 0), -1); // 蓝色标记最小值
    cv::circle(imgColor, maxLoc, 5, cv::Scalar(0, 0, 255), -1); // 红色标记最大值

    cv::imshow("MinMaxLoc", imgColor);
    cv::waitKey(0);

    return 0;
}

示例说明:

  1. 读取图像:使用 cv::imread 以灰度模式读取图像。

  2. 调用 minMaxLoc:传入图像,获取最小值、最大值及其位置。

  3. 输出结果:将最小值和最大值及其位置输出到控制台。

  4. 可视化:在图像上用不同颜色的圆圈标记最小值和最大值的位置,并显示图像。



3. 掩膜的使用

掩膜允许在指定区域内查找最小值和最大值。以下示例展示如何在图像的特定区域内查找最小值和最大值:

// 创建一个与图像大小相同的掩膜,初始为0
cv::Mat mask = cv::Mat::zeros(img.size(), CV_8U);

// 定义掩膜区域,例如一个圆形区域
cv::circle(mask, cv::Point(img.cols / 2, img.rows / 2), 100, cv::Scalar(255), -1);

// 查找掩膜区域内的最小值和最大值
cv::minMaxLoc(img, &minVal, &maxVal, &minLoc, &maxLoc, mask);

// 输出结果
std::cout << "掩膜区域内最小值: " << minVal << " 位置: (" << minLoc.x << ", " << minLoc.y << ")" << std::endl;
std::cout << "掩膜区域内最大值: " << maxVal << " 位置: (" << maxLoc.x << ", " << maxLoc.y << ")" << std::endl;

示例说明:

  1. 创建掩膜:创建一个与图像大小相同的单通道掩膜,并在其中绘制一个圆形区域作为有效区域。

  2. 调用 minMaxLoc:传入掩膜,只在掩膜为非零的区域内查找最小值和最大值。

  3. 输出结果:输出掩膜区域内的最小值和最大值及其位置。



4. 注意事项

  1. 多通道图像:cv::minMaxLoc() 只处理单通道图像。如果输入是多通道图像,需要先将其转换为单通道,例如使用 cv::cvtColor

  2. 掩膜类型:掩膜必须是 8 位单通道图像 (CV_8U),非零的像素表示有效区域。

  3. 性能考虑:对于大尺寸图像或需要频繁调用的场景,可以考虑优化掩膜的创建或提前处理图像,以提高性能。

  4. 精度:最小值和最大值的位置如果存在多个相同的值,cv::minMaxLoc() 返回第一个找到的位置。



5. 应用场景

  • 模板匹配:在模板匹配过程中,可以使用 minMaxLoc() 查找匹配结果中的最佳匹配位置。

  • 图像阈值处理:确定图像的动态范围,以选择合适的阈值。

  • 特征检测:在某些特征检测算法中,需要找到响应值的最大或最小位置。

  • 图像分析:分析图像的亮度分布,识别亮点或暗点。



posted @   做梦当财神  阅读(421)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示