赞
踩
OpenCV中的函数minMaxLoc()用于找出矩阵中的最大值和最小值,并且给出它们中的坐标。
函数原型如下:
C++原型有两个,分别如下:
C++原型一:
void cv::minMaxLoc ( InputArray src,
double * minVal,
double * maxVal = 0,
Point * minLoc = 0,
Point * maxLoc = 0,
InputArray mask = noArray()
)
参数意义如下:
src—输入矩阵,要求是单通道的图像,即二维的矩阵。
minVal—矩阵中的最小值。
maxVal—矩阵中的最大值。
minLoc—矩阵中的最小值的坐标。
maxLoc—矩阵中的最大值的坐标。
mask—掩模矩阵。
C++原型二:
void cv::minMaxLoc ( const SparseMat & a,
double * minVal,
double * maxVal,
int * minIdx = 0,
int * maxIdx = 0
)
参数意义如下:
a—输入矩阵,要求是单通道的图像,即二维的矩阵。
minVal—矩阵中的最小值。
maxVal—矩阵中的最大值。
minIdx—矩阵中最小值的坐标。
maxIdx—矩阵中最大值的坐标。
Python原型如下:
minVal, maxVal, minLoc, maxLoc = cv.minMaxLoc( src[, mask] )
参数意义如下:
src—输入矩阵,要求是单通道的图像,即二维的矩阵。
minVal—矩阵中的最小值。
maxVal—矩阵中的最大值。
minLoc—矩阵中的最小值的坐标。
maxLoc—矩阵中的最大值的坐标。
mask—掩模矩阵。
使用中需注意以下两点:
1 矩阵只能是一维或二维的矩阵,如果是二维以上的矩阵,需要先进行降维处理,比如使用函数reshape()完成,reshape()函数的使用方法可参见下面这篇我的博文:
https://blog.csdn.net/wenhao_ir/article/details/123514750
2 其返回的坐标是列号在前,行号在后,而不是行号在前,列号在后,为什么这样,因为列号相当于是直角坐标系中的x坐标,行号相当于直角坐标系的y坐标。但是要注意,对矩阵元素的引用,则是行号在前,列号在后。实例如下面的代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- # 图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782 # 图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601 # OpenCV的版本为4.1 import cv2 as cv import numpy as np # 新建矩阵array array = np.array([1, 2, 3, 4, 5, 6, 10, 7, 8, 9, 10, 0]) # 将array调整为3*4的单通道图像 img1 = array.reshape((3, 4)) minval_1, maxval_1, minloc_1, maxloc_1 = cv.minMaxLoc(img1) temp1 = img1[2, 1] temp2 = img1[1, 2] print('图像img1中最小值为:{}, 其位置为:{}' .format(minval_1, minloc_1)) print('图像img1中最大值为:{}, 其位置为:{}' .format(maxval_1, maxloc_1))
运行结果如下图所示:
而矩阵img1的内容如下图所示:
可以看出,如果按行在前,列在后,其最小点的坐标应该为(2,3),而不是运行结果中的(3,2),这一点大家在使用中应该特别注意。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。