赞
踩
图像的均值表示图像整体的亮暗程度,图像的均值越大,图像整体越亮。标准差表示图像中明暗变化的程度,标准差越大,表示图像中明暗变化越明显。
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函数计算这两个图像的均值和标准差,最后输出计算结果。
- import cv2
- import numpy as np
-
- # 新建矩阵array
- array = np.array([1, 2, 3, 4, 5, 10, 6, 7, 8, 9, 10, 0])
- # 将array调整为3*4的单通道图像img1
- img1 = array.reshape((3, 4))
- # 将array调整为3*2*2的多通道图像img2
- img2 = array.reshape((3, 2, 2))
-
- # 计算img1的均值
- mean_img1 = cv2.mean(img1)
- # 计算img2的均值
- mean_img2 = cv2.mean(img2)
- # 计算img1的均值和标准差
- mean_std_dev_img1 = cv2.meanStdDev(img1)
- # 计算img2的均值和标准差
- mean_std_dev_img2 = cv2.meanStdDev(img2)
-
- print('mean函数计算结果如下:')
- print(f'图像img1的均值为:{mean_img1}')
- print(f'图像img2的均值为:{mean_img2}\n第一个通道的均值为:{mean_img2[0]}\n第二个通道的均值为:{mean_img2[1]}')
- print('*' * 30)
- print('meanStdDev函数计算结果如下:')
- print(f'图像img1的均值为:{mean_img1[0]}\n标准差为:{mean_std_dev_img1[1]}')
- print(f'图像img2的均值为:{mean_img2}\n第一个通道的均值为:{mean_img2[0]}\n'
- f'第二个通道的均值为:{mean_img2[1]}\n'
- f'均值为:{mean_std_dev_img2[0]}\n'
- f'标准差为:{mean_std_dev_img2[1]}\n'
- f'第一个通道的标准差为:{float(mean_std_dev_img2[1][0])}\n'
- f'第二个通道的标准差为:{float(mean_std_dev_img2[1][0])}\n')
执行这段代码,会输出如下内容:
- mean函数计算结果如下:
- 图像img1的均值为:(5.416666666666666, 0.0, 0.0, 0.0)
- 图像img2的均值为:(5.5, 5.333333333333333, 0.0, 0.0)
- 第一个通道的均值为:5.5
- 第二个通道的均值为:5.333333333333333
- ******************************
- meanStdDev函数计算结果如下:
- 图像img1的均值为:5.416666666666666
- 标准差为:[[3.32812092]]
- 图像img2的均值为:(5.5, 5.333333333333333, 0.0, 0.0)
- 第一个通道的均值为:5.5
- 第二个通道的均值为:5.333333333333333
- 均值为:[[5.5 ]
- [5.33333333]]
- 标准差为:[[2.98607881]
- [3.63623737]]
- 第一个通道的标准差为:2.9860788111948193
- 第二个通道的标准差为:2.9860788111948193
从输出结果可以看出,meanStdDev函数通过元组返回了图像的均值和标准差,元组的第1个元素是均值,第2个元素是标准差。也可以将meanStdDev函数的返回值赋给2个变量,这样可以直接将均值和标准差分别赋给这2个变量,代码如下:
- # 计算img1的均值和标准差
- mean1, std_dev_img1 = cv2.meanStdDev(img1)
- # 计算img2的均值和标准差
- mean2, std_dev_img2 = cv2.meanStdDev(img2)
- print('mean1:',mean1)
- print('std_dev_img1:', std_dev_img1)
- print('mean2:',mean2)
- print('std_dev_img2:', std_dev_img2)
执行这段代码,会输出下面的内容:
- mean1: [[5.41666667]]
- std_dev_img1: [[3.32812092]]
- mean2: [[5.5 ]
- [5.33333333]]
- std_dev_img2: [[2.98607881]
- [3.63623737]]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。