Расчет порога по "более медленной версии" метода Оцу

Этот сайт дает реализацию подхода с дисперсией между классами. Однако я хочу сделать это с помощью дисперсии классов(к сожалению, я не могу опубликовать формулу, но вы можете увидеть ее на сайте), которая считается более медленной. Это мой подход:

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 ответ

Существует очевидная ошибка в коде во всех 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 не сбрасываются перед этими циклами, что означает, что для каждого нового 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;
}

Ваш код не показывает, где вы вычисляете sumGrayvalues а также mitt, давайте предположим, что вы сделали это правильно. Тогда вы также можете увидеть, что sum а также wB может быть вычислено из предыдущей итерации t, добавив только один элемент из hist,

(Я не запускал код, я не делаю Java, поэтому я не уверен, есть ли другие проблемы.)

Другие вопросы по тегам