目录
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_8U
、CV_32F
或CV_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;
}
示例说明:
-
读取图像:使用
cv::imread
以灰度模式读取图像。 -
调用
minMaxLoc
:传入图像,获取最小值、最大值及其位置。 -
输出结果:将最小值和最大值及其位置输出到控制台。
-
可视化:在图像上用不同颜色的圆圈标记最小值和最大值的位置,并显示图像。
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;
示例说明:
-
创建掩膜:创建一个与图像大小相同的单通道掩膜,并在其中绘制一个圆形区域作为有效区域。
-
调用
minMaxLoc
:传入掩膜,只在掩膜为非零的区域内查找最小值和最大值。 -
输出结果:输出掩膜区域内的最小值和最大值及其位置。
4. 注意事项
-
多通道图像:
cv::minMaxLoc()
只处理单通道图像。如果输入是多通道图像,需要先将其转换为单通道,例如使用cv::cvtColor
。 -
掩膜类型:掩膜必须是 8 位单通道图像 (
CV_8U
),非零的像素表示有效区域。 -
性能考虑:对于大尺寸图像或需要频繁调用的场景,可以考虑优化掩膜的创建或提前处理图像,以提高性能。
-
精度:最小值和最大值的位置如果存在多个相同的值,
cv::minMaxLoc()
返回第一个找到的位置。
5. 应用场景
-
模板匹配:在模板匹配过程中,可以使用
minMaxLoc()
查找匹配结果中的最佳匹配位置。 -
图像阈值处理:确定图像的动态范围,以选择合适的阈值。
-
特征检测:在某些特征检测算法中,需要找到响应值的最大或最小位置。
-
图像分析:分析图像的亮度分布,识别亮点或暗点。
标签:掩膜,最大值,minMaxLoc,OpenCV,最小值,图像,cv From: https://www.cnblogs.com/keye/p/18442230