Расчет порога по «более медленной версии» метода Оцу - PullRequest
0 голосов
/ 14 декабря 2018

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

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 голосов
/ 15 декабря 2018

Существует очевидная ошибка в коде во всех 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, поэтому не уверен, есть ли другие проблемы.)

...