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),这一点大家在使用中应该特别注意。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐