Python 非零值的opencv meanStdDev
我想计算忽略零的图像的平均值和统计数据。因为我不知道如何在cv2.meanstdev中使用mask参数,所以我想我可以用一点数学来解决问题 据 标准偏差按照如下公式计算: 下面的代码现在尝试“返回该公式”,以修复为所有不应考虑的零添加的值的结果Python 非零值的opencv meanStdDev,python,opencv,math,Python,Opencv,Math,我想计算忽略零的图像的平均值和统计数据。因为我不知道如何在cv2.meanstdev中使用mask参数,所以我想我可以用一点数学来解决问题 据 标准偏差按照如下公式计算: 下面的代码现在尝试“返回该公式”,以修复为所有不应考虑的零添加的值的结果 import cv2 import numpy as np import math def test_Stats(): h=2 w=2 channels=3 image=np.zeros((h,w,channe
import cv2
import numpy as np
import math
def test_Stats():
h=2
w=2
channels=3
image=np.zeros((h,w,channels), np.uint8)
image[0,0]=(100,50,200)
image[0,1]=(120,60,220)
(means, stds) = cv2.meanStdDev(image)
gmean,bmean,rmean=means.flatten()
gstds,bstds,rstds=stds.flatten()
print ("means %.1f %.1f %.1f " % (gmean,bmean,rmean))
print ("stds %.1f %.1f %.1f " % (gstds,bstds,rstds))
b = image[:,:,0]
g = image[:,:,1]
r = image[:,:,2]
h, w = image.shape[:2]
pixels=h*w
nonzerotupel= cv2.countNonZero(b),cv2.countNonZero(g),cv2.countNonZero(r)
nonzero=max(nonzerotupel)
print ("%d pixel %d non-zero" % (pixels,nonzero))
factor=pixels/nonzero
fgmean=gmean*factor
fbmean=bmean*factor
frmean=rmean*factor
print ("non-zero means %.1f %.1f %.1f" % (fgmean,fbmean,frmean))
fsqsumb=(bstds*bstds+bmean*bmean)/pixels
fsqsumg=(gstds*gstds+gmean*gmean)/pixels
fsqsumr=(rstds*rstds+rmean*rmean)/pixels
fstdsb=math.sqrt(max(fsqsumb*nonzero-fbmean*fbmean,0))
fstdsg=math.sqrt(max(fsqsumg*nonzero-fgmean*fgmean,0))
fstdsr=math.sqrt(max(fsqsumr*nonzero-frmean*frmean,0))
print ("non-zero stds %.1f %.1f %.1f" % (fstdsb,fstdsg,fstdsr))
使用以下工具运行它:
test_Stats()
给出:
means 55.0 27.5 105.0
stds 55.5 27.7 105.2
4 pixel 2 non-zero
non-zero means 110.0 55.0 210.0
non-zero stds 0.0 0.0 0.0
看来我犯了点错误。在本例中,非零性传播疾病的预期结果为10.0,5.0,10.0
解决方案是什么?
修复后如何进一步改进此代码?我想我发现了错误。 第一个问题的答案如下:解决方案是什么? <>原因:C++版本中的ITOTAL意味着“逆总数”-1/总数。我以为它的意思是“整数合计”。因此,像素非零调整需要固定。结果是现在
means 55.00 27.50 105.00
stds 55.45 27.73 105.24
4 pixel 2 non-zero
non-zero means 110.00 55.00 210.00
fsqsum 6100.00 24400.00 88400.00
non-zero stds 5.00 10.00 10.00
这看起来很好。问题2:修复后,如何进一步改进此代码?
仍然开放
def test_Stats():
h=2
w=2
channels=3
image=np.zeros((h,w,channels), np.uint8)
image[0,0]=(100,50,200)
image[0,1]=(120,60,220)
(means, stds) = cv2.meanStdDev(image)
gmean,bmean,rmean=means.flatten()
gstds,bstds,rstds=stds.flatten()
print ("means %.2f %.2f %.2f " % (gmean,bmean,rmean))
print ("stds %.2f %.2f %.2f " % (gstds,bstds,rstds))
b = image[:,:,0]
g = image[:,:,1]
r = image[:,:,2]
h, w = image.shape[:2]
pixels=h*w
nonzerotupel= cv2.countNonZero(b),cv2.countNonZero(g),cv2.countNonZero(r)
nonzero=max(nonzerotupel)
print ("%d pixel %d non-zero" % (pixels,nonzero))
factor=pixels/nonzero
fgmean=gmean*factor
fbmean=bmean*factor
frmean=rmean*factor
print ("non-zero means %.2f %.2f %.2f" % (fgmean,fbmean,frmean))
fsqsumb=(bstds*bstds+bmean*bmean)*pixels
fsqsumg=(gstds*gstds+gmean*gmean)*pixels
fsqsumr=(rstds*rstds+rmean*rmean)*pixels
print ("fsqsum %.2f %.2f %.2f" % (fsqsumb,fsqsumg,fsqsumr))
fstdsb=math.sqrt(max(fsqsumb/nonzero-fbmean*fbmean,0))
fstdsg=math.sqrt(max(fsqsumg/nonzero-fgmean*fgmean,0))
fstdsr=math.sqrt(max(fsqsumr/nonzero-frmean*frmean,0))
print ("non-zero stds %.2f %.2f %.2f" % (fstdsb,fstdsg,fstdsr))
作为一项功能:
def fixMeans(self,means,stds,pixels,nonzero):
""" fix the zero based means to nonzero based see https://stackoverflow.com/a/58891531/1497139"""
gmean,bmean,rmean=means.flatten()
gstds,bstds,rstds=stds.flatten()
if Color.debug:
print ("means %.2f %.2f %.2f " % (gmean,bmean,rmean))
print ("stds %.2f %.2f %.2f " % (gstds,bstds,rstds))
factor=pixels/nonzero
fgmean=gmean*factor
fbmean=bmean*factor
frmean=rmean*factor
if Color.debug:
print ("non-zero means %.2f %.2f %.2f" % (fgmean,fbmean,frmean))
fsqsumb=(bstds*bstds+bmean*bmean)*pixels
fsqsumg=(gstds*gstds+gmean*gmean)*pixels
fsqsumr=(rstds*rstds+rmean*rmean)*pixels
if (Color.debug):
print ("fsqsum %.2f %.2f %.2f" % (fsqsumb,fsqsumg,fsqsumr))
fstdsb=math.sqrt(max(fsqsumb/nonzero-fbmean*fbmean,0))
fstdsg=math.sqrt(max(fsqsumg/nonzero-fgmean*fgmean,0))
fstdsr=math.sqrt(max(fsqsumr/nonzero-frmean*frmean,0))
if Color.debug:
print ("non-zero stds %.2f %.2f %.2f" % (fstdsb,fstdsg,fstdsr))
fixedmeans=fgmean,fbmean,frmean
fixedstds=fstdsb,fstdsg,fstdsr
return fixedmeans,fixedstds
请注意,在此期间,我转而从直方图计算东西。有关直方图,请参阅,首先可以更改范围并忽略零。那容易多了。
def fixMeans(self,means,stds,pixels,nonzero):
""" fix the zero based means to nonzero based see https://stackoverflow.com/a/58891531/1497139"""
gmean,bmean,rmean=means.flatten()
gstds,bstds,rstds=stds.flatten()
if Color.debug:
print ("means %.2f %.2f %.2f " % (gmean,bmean,rmean))
print ("stds %.2f %.2f %.2f " % (gstds,bstds,rstds))
factor=pixels/nonzero
fgmean=gmean*factor
fbmean=bmean*factor
frmean=rmean*factor
if Color.debug:
print ("non-zero means %.2f %.2f %.2f" % (fgmean,fbmean,frmean))
fsqsumb=(bstds*bstds+bmean*bmean)*pixels
fsqsumg=(gstds*gstds+gmean*gmean)*pixels
fsqsumr=(rstds*rstds+rmean*rmean)*pixels
if (Color.debug):
print ("fsqsum %.2f %.2f %.2f" % (fsqsumb,fsqsumg,fsqsumr))
fstdsb=math.sqrt(max(fsqsumb/nonzero-fbmean*fbmean,0))
fstdsg=math.sqrt(max(fsqsumg/nonzero-fgmean*fgmean,0))
fstdsr=math.sqrt(max(fsqsumr/nonzero-frmean*frmean,0))
if Color.debug:
print ("non-zero stds %.2f %.2f %.2f" % (fstdsb,fstdsg,fstdsr))
fixedmeans=fgmean,fbmean,frmean
fixedstds=fstdsb,fstdsg,fstdsr
return fixedmeans,fixedstds