用大津法的“慢版本”计算阈值

时间:2018-12-14 20:56:04

标签: java image-processing image-thresholding

This site提供了在类差异之间进行的方法的实现。但是,我想在类差异内进行操作(不幸的是,我可以做到) t发布公式,但您可以在网站上看到它),该公式被认为比较慢。这是我的方法:

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;
    }
}

我总是零。我该怎么办?

1 个答案:

答案 0 :(得分:1)

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

for(int i =1; i <=t; i++) {
    sum+= i*hist[i];
}
for(int i =1; i <=t; i++) {
    wB += hist[i];
}
在这些循环之前,不会重设

sumwB,这意味着,对于每个新的t,请将这些值添加到为先前的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;
}

您的代码未显示您计算sumGrayvaluesmitt的位置,我们假设您做对了。然后,您还可以看到sumwB可以从t的上一个迭代中计算出来,只需从hist中添加一个元素即可。

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