OpenCV minMaxLoc()函数找出图像中最小值最大值

这篇具有很好参考价值的文章主要介绍了OpenCV minMaxLoc()函数找出图像中最小值最大值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

OpenCV 找出图像中最小值最大值函数minMaxLoc的使用
功能:从一个矩阵中找出全局的最大值和最小值。

函数cv::minMaxLoc找出最大和最小元素的值和他们的位置。极值是遍历整个矩阵找到,或者当掩码不是一个空矩阵时,是通过遍历指定矩阵区域找到。

函数不适用于多通道矩阵,如果需要遍历所有的通道来找到最大和最小值,首先使用函数Mat::reshape转换为单通道矩阵。或者你可以使用函数 extractImageCOI ,mixChannels , or split 来提取特定通道。

1 函数解析

1.1 函数原型1

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());

参数说明:

参数1:InputArray类型的src,输入单通道数组(图像)。
参数2double*类型的minVal,返回最小值的指针。若无须返回,此值置为NULL。
参数3double*类型的maxVal,返回最大值的指针。若无须返回,此值置为NULL。
参数4:Point*类型的minLoc,返回最小位置的指针(二维情况下)。若无须返回,此值置为NULL。
参数5:Point*类型的maxLoc,返回最大位置的指针(二维情况下)。若无须返回,此值置为NULL。
参数6:InputArray类型的mask,用于选择子阵列的可选掩膜。

1.2 函数原型2

 CV_EXPORTS void minMaxIdx(InputArray src, double* minVal, double* maxVal = 0,
                           int* minIdx = 0, int* maxIdx = 0, InputArray mask = noArray());

参数说明:

参数1 src 输入单通道矩阵.

参数1 minVal 返回最小值的指针; 如果不需要输入NULL.

参数 maxVal 返回最大值的指针; 如果不需要输入NULL.

参数 minIdx 返回最小值位置的指针 ((n维情况下); 如果不需要输入NULL. 否则,它必须指向src.dims元素的一个矩阵, 每个维度里最小元素的坐标按顺序存储.

参数 maxIdx 返回最大值位置的指针 ((n维情况下); 如果不需要输入NULL.

参数 mask 指定矩阵区域.

注意:
在稀疏矩阵中,最小值是只能在非零元素中找到。

当minIdx 不是NULL的时候,他必须有至少两个元素(同maxIdx),即使src是一个单行或者单列矩阵。在OpenCV (跟随MATLAB)中每个矩阵至少要有两个维度。单列矩阵是Mx1 矩阵(因此 minIdx/maxIdx将是(i1,0)/(i2,0)),单行矩阵是 1xN矩阵(因此minIdx/maxIdx 将是(0,j1)/(0,j2))。

1.2 函数原型3

 CV_EXPORTS void minMaxLoc(const SparseMat& a, double* minVal,
                           double* maxVal, int* minIdx = 0, int* maxIdx = 0);

参数说明:

参数1 a 输入单通道矩阵.

参数2 minVal 返回最小值的指针; 如果不需要输入NULL.

参数3 maxVal 返回最大值的指针; 如果不需要输入NULL.

参数4 minIdx 返回最小值位置的指针 ((n维情况下); 如果不需要输入NULL. 否则,它必须指向src.dims元素的一个矩阵, 每个维度里最小元素的坐标按顺序存储.

参数5 maxIdx 返回最大值位置的指针 ((n维情况下); 如果不需要输入NULL.

2 示例

对"lena.png"图像进行三通道分离,
找出每个通道颜色的最小值和最大值
minmaxloc,opencv,计算机视觉,人工智能,算法

#include<opencv.hpp>
#include<iostream>
#include<string>
using namespace std;
using namespace cv;
int main() {
    Mat src = imread("lena.png");
    imshow("src", src);

    //通道分离
    vector<Mat>images;
    split(src, images);

    //计算各通道直方图,并进行统计
    //https://www.cnblogs.com/bjxqmy/p/12378312.html
    vector<Mat>bgr(3);
    int channels[] = { 0,1,2 };
    int histsize[] = { 10,10,10 };
    float r[] = { 0,255 };
    const float* ranges[] = { r,r,r };
    Scalar colors[] = { Scalar(255,0,0),Scalar(0,255,0),Scalar(0,0,255) };
    string names[] = { "蓝色通道","绿色通道","红色通道" };
    for (int i = 0; i < 3; i++) {
        calcHist(&src, 3, &channels[i], Mat(), bgr[i], 1, &histsize[i], &ranges[i], true);
        normalize(bgr[i], bgr[i], 1, 0, NORM_L1);//https://www.cnblogs.com/bjxqmy/p/12292421.html
        double mx, mn; Point pmx, pmn;
        minMaxLoc(bgr[i], &mn, &mx, &pmn, &pmx);

        double width = 255.0 / histsize[i];
        cout << names[i] << endl;
        cout << "数量最少的颜色范围:[" << pmn.y * width << "," << (pmn.y + 1) * width << "] 占比:" << mn * 100 << "%" << endl;
        cout << "数量最多的颜色范围:[" << pmx.y * width << "," << (pmx.y + 1) * width << "] 占比:" << mx * 100 << "%" << endl;
        cout << endl;

        imshow(names[i], images[i]);
    }
    waitKey(0);
}

minmaxloc,opencv,计算机视觉,人工智能,算法
minmaxloc,opencv,计算机视觉,人工智能,算法文章来源地址https://www.toymoban.com/news/detail-714543.html

到了这里,关于OpenCV minMaxLoc()函数找出图像中最小值最大值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包