Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 非零值的opencv meanStdDev_Python_Opencv_Math - Fatal编程技术网

Python 非零值的opencv meanStdDev

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

我想计算忽略零的图像的平均值和统计数据。因为我不知道如何在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,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