当前位置:   article > 正文

【计算机视觉】OpenCV 4高级编程与项目实战(Python版)【9】:计算图像均值和标准差_python opencv 计算编标准差 方差

python opencv 计算编标准差 方差

图像的均值表示图像整体的亮暗程度,图像的均值越大,图像整体越亮。标准差表示图像中明暗变化的程度,标准差越大,表示图像中明暗变化越明显。

OpenCV提供了mean函数用于计算图像的均值,提供了meanStdDev函数用于同时计算图像的均值和标准差。

mean函数的原型如下:

mean(src[, mask]) ->   retval

参数说明:

  • src:待求均值的图像的矩阵。可以是1 ~ 4通道的图像(1 ~ 4维的矩阵)。

  • mask:可选参数,图像掩模。尺寸与src参数相同,用于标记求哪些区域的均值。

  • retval:返回值,长度为4的元组。每一个元组元素表示对应通道的均值,如果没有该通道,则对应的值为0.0。

计算均值的原理如图1所示。

I表示输入的图像的矩阵;mask表示掩模矩阵;mask(I)表示掩模矩阵中的某个值;N表示图像矩阵元素的个数;Mc表示第C通道的均值;src(I)c表示第C个通道中像素的灰度值。

meanStdDev函数的原型如下:

meanStdDev(src[,mean[,stddev[,mask]]])->mean, stddev

参数说明:

  • src:待求均值和标准差的图像的矩阵。

  • mean:可选参数,图像每个通道的均值。

  • stddev:可选参数,图像每个通道的标准差。

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

  • mean:返回值,计算得出的图像的均值。

  • stddev:返回值,计算得出的图像的标准差。

meanStdDev函数可以同时计算图像的均值和标准差,并将计算结果返回。第1个参数(src)和第4个参数(mask)与mean函数中同名参数的含义与用法相同。如果不指定第4个参数的值,表示计算矩阵内所有区域的均值和标准差。meanStdDev函数返回的均值和标准差中的值,会根据输入图像的通道数不同而不同,例如,如果输入的图像只有一个通道,则该函数计算得到的均值和标准差也只有一个值。第2个参数(mean)和第3个参数(stddev)是可选的,如果不指定这两个参数,均值和标准差会通过meanStdDev函数的返回值返回,如果指定这两个参数,那么均值和标准差会通过这两个参数返回。

meanStdDev计算均值的公式与图1所示的计算公式完全相同,计算标准差的公式如图2所示。这个公式中相关参数的含义与图1所示的计算均值的公式中同名的参数的含义和用法完全相同。

下面的代码使用reshape函数将一维数组(长度为12)转换为3×4的单通道图像和3×2×2的多通道图像,然后使用mean函数计算这两个图像的均值,使用meanStdDev函数计算这两个图像的均值和标准差,最后输出计算结果。

  1. import cv2
  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的单通道图像img1
  6. img1 = array.reshape((3, 4))
  7. # 将array调整为3*2*2的多通道图像img2
  8. img2 = array.reshape((3, 2, 2))
  9. # 计算img1的均值
  10. mean_img1 = cv2.mean(img1)
  11. # 计算img2的均值
  12. mean_img2 = cv2.mean(img2)
  13. # 计算img1的均值和标准差
  14. mean_std_dev_img1 = cv2.meanStdDev(img1)
  15. # 计算img2的均值和标准差
  16. mean_std_dev_img2 = cv2.meanStdDev(img2)
  17. print('mean函数计算结果如下:')
  18. print(f'图像img1的均值为:{mean_img1}')
  19. print(f'图像img2的均值为:{mean_img2}\n第一个通道的均值为:{mean_img2[0]}\n第二个通道的均值为:{mean_img2[1]}')
  20. print('*' * 30)
  21. print('meanStdDev函数计算结果如下:')
  22. print(f'图像img1的均值为:{mean_img1[0]}\n标准差为:{mean_std_dev_img1[1]}')
  23. print(f'图像img2的均值为:{mean_img2}\n第一个通道的均值为:{mean_img2[0]}\n'
  24. f'第二个通道的均值为:{mean_img2[1]}\n'
  25. f'均值为:{mean_std_dev_img2[0]}\n'
  26. f'标准差为:{mean_std_dev_img2[1]}\n'
  27. f'第一个通道的标准差为:{float(mean_std_dev_img2[1][0])}\n'
  28. f'第二个通道的标准差为:{float(mean_std_dev_img2[1][0])}\n')

执行这段代码,会输出如下内容:

  1. mean函数计算结果如下:
  2. 图像img1的均值为:(5.416666666666666, 0.0, 0.0, 0.0)
  3. 图像img2的均值为:(5.5, 5.333333333333333, 0.0, 0.0)
  4. 第一个通道的均值为:5.5
  5. 第二个通道的均值为:5.333333333333333
  6. ******************************
  7. meanStdDev函数计算结果如下:
  8. 图像img1的均值为:5.416666666666666
  9. 标准差为:[[3.32812092]]
  10. 图像img2的均值为:(5.5, 5.333333333333333, 0.0, 0.0)
  11. 第一个通道的均值为:5.5
  12. 第二个通道的均值为:5.333333333333333
  13. 均值为:[[5.5 ]
  14. [5.33333333]]
  15. 标准差为:[[2.98607881]
  16. [3.63623737]]
  17. 第一个通道的标准差为:2.9860788111948193
  18. 第二个通道的标准差为:2.9860788111948193

从输出结果可以看出,meanStdDev函数通过元组返回了图像的均值和标准差,元组的第1个元素是均值,第2个元素是标准差。也可以将meanStdDev函数的返回值赋给2个变量,这样可以直接将均值和标准差分别赋给这2个变量,代码如下:

  1. # 计算img1的均值和标准差
  2. mean1, std_dev_img1 = cv2.meanStdDev(img1)
  3. # 计算img2的均值和标准差
  4. mean2, std_dev_img2 = cv2.meanStdDev(img2)
  5. print('mean1:',mean1)
  6. print('std_dev_img1:', std_dev_img1)
  7. print('mean2:',mean2)
  8. print('std_dev_img2:', std_dev_img2)

执行这段代码,会输出下面的内容:

  1. mean1: [[5.41666667]]
  2. std_dev_img1: [[3.32812092]]
  3. mean2: [[5.5 ]
  4. [5.33333333]]
  5. std_dev_img2: [[2.98607881]
  6. [3.63623737]]

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

闽ICP备14008679号