Расчет порога по "более медленной версии" метода Оцу
Этот сайт дает реализацию подхода с дисперсией между классами. Однако я хочу сделать это с помощью дисперсии классов(к сожалению, я не могу опубликовать формулу, но вы можете увидеть ее на сайте), которая считается более медленной. Это мой подход:
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, поэтому я не уверен, есть ли другие проблемы.)