作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
This site给出了具有类间方差的方法的实现。但是,我想用类内方差来实现该方法(不幸的是,我无法发布公式,但您可以请在网站上查看),这被认为速度较慢。这是我的方法:
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;
}
}
我的成绩总是为零。我能做什么?
最佳答案
用于累积给定 t
值的所有 4 个循环的代码中存在一个明显的错误:
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
的位置,让我们假设您做对了。然后您还可以看到,通过仅添加 中的单个元素,可以根据
。t
的上一次迭代计算 sum
和 wB
历史记录
(我没有运行过代码,我不做Java,所以我不确定是否还有其他问题。)
关于java - 通过大津法的 "slower version"计算阈值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53786768/
我是一名优秀的程序员,十分优秀!