请教关于fpga图像阈值处理
希望各位前辈能够给一个思路,或者提供一下一些相关的例程,指点一下迷津,不甚感激。
这个算法是moment-preserving,有熟悉ostu算法的大虾也希望能指点一下。
-----------------------------------------------------------
/* compute probabilities */
//NHIST /* no. bins in histogram */
//n /*total pixel/
for (i = 0; i < NHIST; i++)
prob = (double) iHist / (double) n;
/* calculate first 3 moments */
m1 = m2 = m3 = 0.0;
for (i = 0; i < NHIST; i++) {
m1 += i * prob;
m2 += i * i * prob;
m3 += i * i * i * prob;
}
cd = m2 - m1 * m1;
c0 = (-m2 * m2 + m1 * m3) / cd;
c1 = (-m3 + m2 * m1) / cd;
z0 = 0.5 * (-c1 - sqrt (c1 * c1 - 4.0 * c0));
z1 = 0.5 * (-c1 + sqrt (c1 * c1 - 4.0 * c0));
pd = z1 - z0;
p0 = (z1 - m1) / pd;
p1 = 1.0 - p0;
/* find threshold */
for (thresh = 0, pDistr = 0.0; thresh < NHIST; thresh++) {
pDistr += prob[thresh];
if (pDistr > p0)
break;
}
用状态机控制。
第一个状态做
m1 += i * prob;
第二个做
m2 += i * i * prob;
第三个做
m3 += i * i * i * prob;
。
非常感谢小编的回答,还有几个疑问,这里乘除法是不是一定要调用ipcore,还是可以添加了arith的库,然后用*和/运算?
我大致写了这么一段,好心人能不能看一看这样写有哪些问题。
process(pre_state,cnt_m)
变量声明.........
begin
case pre_state is
when s0=>
t1:=cnt_m*prob;
m1:=m1+t1;
nx_state<=s1;
when s1=>
t2:=cnt_m*t1;
m2:=m2+t2;
nx_state<=s2;
when s2=>
t3:=cnt_m*t2;
m3:=m3+t3;
if(cnt_m='255') then
nx_state<=s3;
else
nx_state<=s0;
end if;
when s3=>
mp1:=m1*m1;
cd:=m2-mp1;
nx_state<=s4;
when s4=>
mp2:=m2*m2;
m13:=m1*m3;
c0:=m13-mp2;
c0:=c0/cd;
nx_state<=s5;
。。
没有看明白小编的第一个for的意思,是不是写错啦?
问题的关键在于prob是怎么产生的,如果prob只是和NHIST以及n有关,那么m1,m2,m3,..pd,p0,p1都不需要硬件来计算。
没有写错,因为直方图统计的vhdl没有什么疑问,所以没有列出来。直方图统计的c代码是这样的/* compile histogram */
for (i = 0; i < NHIST; i++)
iHist = 0;
for (y = 0, n = 0; y < height; y++) {
for (x = 0; x < width; x++) {
iHist[imgIn[y][x]]++;
n++;
}
}
/* compute probabilities */
for (i = 0; i < NHIST; i++)
prob = (double) iHist / (double) n;
现在这部分vhdl已经写好了,也就是一个ram里存了统计后的prob数据,地址是0-255,请问楼上所说的“不用硬件算出应该如何处理”,指点一下,谢谢
第一个for循环中的n有什么作用?
第二个for循环里面的i并没有出现在prob表达式里。
n 是计数,输入多少个pixel,在一楼已经特别注释出来
至于第二个,从vim里粘贴出来的时候漏了,没有检查抱歉。应该是
/* compute probabilities */
for (i = 0; i < NHIST; i++)
prob[i] = (double) iHist[i] / (double) n;
It is good to know people is still using VHDL.
继续顶起来,望好心人指点一下
