当前位置:   article > 正文

【计算机视觉】OpenCV 4高级编程与项目实战(Python版)【8】:图像像素统计_python opencv统计图像像素值总和

python opencv统计图像像素值总和

图像通过一定尺寸的矩阵表示,矩阵中每个元素的大小表示图像中每个像素的明暗程度。查找矩阵中的最大值就是寻找图像中灰度值最大的像素,计算矩阵的平均值就是计算图像像素的平均灰度,可以用平均灰度表示图像整体的亮暗程度。因此,针对图像矩阵数据的统计和分析,在图像处理工作中具有非常重要的意义。OpenCV集成了求取图像像素最大值、最小值、均值、标准差等函数,本节将详细介绍这些函数的使用方法。

OpenCV提供了用于寻找图像像素的最大值、最小值的minMaxLoc函数,该函数的原型如下:

cv.minMaxLoc( src[, mask])-> minVal, maxVal, minLoc, maxLoc

参数说明:

  • src:需要寻找最大值和最小值的图像,必须是表示图像的单通道数组。

  • mask:可选参数,图像掩模。

  • minVal:返回值,图像中的最小值。

  • maxVal:返回值,图像中的最大值。

  • minLoc:返回值,图像中的最小值在矩阵中的坐标。

  • maxLoc:返回值,图像中的最大值的矩阵中的坐标。

minMaxLoc函数实现的功能是寻找图像中指定区域内的最值,并将寻找到的最值以及相关的数据通过该函数返回。但要注意的是,src参数必须是表示单通道图像的矩阵。如果是多通道图像,需要使用np.reshape函数将其转换为单通道图像,或者分别寻找每个通道的最值,然后寻找指定区域内的最值。第2个参数mask用于在图像的指定区域内寻找最值,默认值是None,表示寻找范围是图像中的所有数据。

注意:如果图像中存在多个最大像素值或最小像素值,那么minMaxLoc函数会输出按行扫描从左到右第1次检测到最值的位置。

在对图像进行操作的过程中,往往需要对图像尺寸和通道数进行调整,NumPy为我们提供了reshape函数可以实现这一功能,reshape函数的原型如下:

np.reshape(array, shape[,order]) -> dst

参数说明:

  • array:需要调整尺寸和通道数的图像矩阵。

  • shape:调整后的矩阵的维度。

  • order:读取/写入元素时的顺序。

reshape函数可以对图像的尺寸和通道数进行调整,并将调整后的结果通过值返回。第2个参数shape是调整后矩阵的维度,要以元组形式传入,例如,(3,4)表示将矩阵调整为3行4列,当我们不知道矩阵中元素的具体个数时,也可以将其中一个维度设为-1,此时reshape函数会根据元素的个数自动计算这个维度。第3个参数order表示写入元素时的顺序,‘C’表示按C顺序读取/写入元素;‘F’表示按FORTRAN顺序读取/写入元素;‘A’表示如果该矩阵在内存中连续,则按照FORTRAN顺序读取/写入元素,否则,按C顺序写入元素;默认值是‘C’。

注意:在使用第2个参数(shape)时,应该保证shape指定的所有维度的乘积与array指定的数组的所有温度的乘积相同。例如,array指定数组的维度是(3,8),那么shape指定的维度可以是(2,12),(4,6)、(3,4,2)等,但不能指定像(2,6)、(3,6)这样的维度。因为array数组维度的乘积是24,而(2,6)的维度乘积是12,(3,6)的维度乘积是18。如果指定了错误的shape参数值,可能会出现错误和矩阵内元素丢失的情况。对于较大的矩阵,若不能预先计算出矩阵元素的个数,可以某个维度指定为-1,如(2, -1)、(-1, 6)等。但只能有1个维度指定为-1,如果有超过一个维度指定为-1,仍然会会抛出异常。即使某一个维度指定为-1,其他维度的乘积也要可以被array数组所有维度的乘积整除,否则仍然会抛出异常。例如,前面的例子,如果设置shape参数值为(5, 2, -1),尽管最后一个维度为-1,但由于array数组维度的乘积为24,而24/(5×2)并不是整数,也就是说,reshape函数是无法算最后一个维度的,因此,指定这样的shape参数值也会抛出异常。

下面的例子使用reshape函数将一维数组(长度为12)转换为二维(3×4)数组和三维(3×2×2)数组,并将其中一个维度的值设置为-1,让reshape函数自动计算该维度,最后使用minMaxLoc函数分别计算这些转换后的数组中的最大值和最小值。

  1. import cv2 as cv
  2. import numpy as np
  3. # 新建矩阵array
  4. array = np.array([1, 2, 3, 4, 5, 10, 6, 7, 8, 9, 10, 0])
  5. # 将array调整为3*4的数组
  6. img1 = array.reshape((3, 4))
  7. minval_1, maxval_1, minloc_1, maxloc_1 = cv.minMaxLoc(img1)
  8. print('数组img1中最小值为:{}, 其位置为:{}' .format(minval_1, minloc_1))
  9. print('数组img1中最大值为:{}, 其位置为:{}' .format(maxval_1, maxloc_1))
  10. # 先将array调整为3*2*2的数组
  11. img2 = array.reshape((3, 2, 2))
  12. # 再利用-1的方法调整尺寸
  13. img2_re = img2.reshape((1, -1))
  14. minval_2, maxval_2, minloc_2, maxloc_2 = cv.minMaxLoc(img2_re)
  15. print('数组img2中最小值为:{}, 其位置为:{}'.format(minval_2, minloc_2))
  16. print('数组img2中最大值为:{}, 其位置为:{}'.format(maxval_2, maxloc_2))

运行这段程序,会输出如下内容:

  1. 数组img1中最小值为:0.0, 其位置为:(3, 2)
  2. 数组img1中最大值为:10.0, 其位置为:(1, 1)
  3. 数组img2中最小值为:0.0, 其位置为:(11, 0)
  4. 数组img2中最大值为:10.0, 其位置为:(5, 0)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/252723
推荐阅读
相关标签
  

闽ICP备14008679号