0

该站点提供了具有类间差异的方法的实现。但是,我希望在类方差内进行(不幸的是我无法发布公式,但您可以在网站上看到它),这被认为是较慢的。这是我的方法:

double varb,varf = 0;
int sum,wB,wF,treshold = 0 
double varMin = Float.MAX_VALUE;
for (int t=0 ; t<256; t++) {
    for(int i =1; i <=t; i++) {
        sum+= i*hist[i];
    }
    for(int i =1; i <=t; i++) {
        wB += hist[i];
    }
    sumB += (float) (t * histo[t]);
    wF = N - wB;
    double mB =(double) N*sumB / wB; // Mean Background
    double mF = (double) N*(sum - sumB) / wF; // sum is the sum of all grey values

    for(int i =1; i <=t; i++) {
        varb += (i-mB)*(i-mB)*(hist[i]/N)/wB;
    }
    for(int i =t+1; i <256; i++) {
        varb += (i-mF)*(i-mF)*(hist[i]/N)/wF;
    }
    double var = wB*varb/N + wF * varf/N;
    if (var < varMin) {  //checks for the smallest variance
        varMin = var;
        threshold = t;
    }
}

我总是零。我能做些什么?

4

1 回答 1

1

在用于累积给定值的所有 4 个循环中,代码中都有一个明显的错误t

for(int i =1; i <=t; i++) {
    sum+= i*hist[i];
}
for(int i =1; i <=t; i++) {
    wB += hist[i];
}

sum并且wB不会在这些循环之前重置,这意味着对于每个 new t,您将这些值添加到为 previous 计算的值中t。正确的是:

sum = 0;
wB = 0;
for(int i =1; i <=t; i++) {
    sum+= i*hist[i];
    wB += hist[i];    // (also no need for looping twice over `hist`)
}

另外两个循环:

for(int i =1; i <=t; i++) {
    varb += (i-mB)*(i-mB)*(hist[i]/N)/wB;
}
for(int i =t+1; i <256; i++) {
    varb += (i-mF)*(i-mF)*(hist[i]/N)/wF;
}

在这里也会发生同样的情况,但您也使用varb了两次,并且从不使用varf. 正确的:

varb = 0;
varf = 0;
for(int i =1; i <=t; i++) {
    varb += (i-mB)*(i-mB)*(hist[i]/N)/wB;
}
for(int i =t+1; i <256; i++) {
    varf += (i-mF)*(i-mF)*(hist[i]/N)/wF;
}

您的代码没有显示您计算sumGrayvalues的位置mitt,我们假设您做对了。然后您还可以看到sum并且wB可以从 的上一次迭代中计算出来t,只需从 中添加一个元素即可hist

(我没有运行代码,我不做Java,所以我不确定是否还有其他问题。)

于 2018-12-14T21:24:18.237 回答