在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3909|回复: 8

[求助] 请教关于fpga图像阈值处理

[复制链接]
发表于 2011-7-9 22:45:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
最近尝试着用fpga做图像二值化处理,把c算法转化成vhdl实现。目前完成的是把图片读入到rom,然后做一个直方图统计。但对于c算法中的阈值确定这部分有疑问,对于这些有数据相关性的复杂运算如何处理。是否就是调用乘、除法模块搭一串电路? 如果把m1复用生成m2,m2再生成m3,势必会有一个延迟,那么后面计算诸如cd = m2 - m1 * m1如何同步?

希望各位前辈能够给一个思路,或者提供一下一些相关的例程,指点一下迷津,不甚感激。

这个算法是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;
  }
发表于 2011-7-9 23:16:28 | 显示全部楼层
用状态机控制。
第一个状态做
    m1 += i * prob;
第二个做
    m2 += i * i * prob;
第三个做
    m3 += i * i * i * prob;
。。。。。。。。。。。。。。。。
 楼主| 发表于 2011-7-10 18:50:42 | 显示全部楼层
非常感谢版主的回答,还有几个疑问,这里乘除法是不是一定要调用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;
。。。。。。。。。。。
发表于 2011-7-10 19:33:00 | 显示全部楼层
没有看明白楼主的第一个for的意思,是不是写错啦?
问题的关键在于prob是怎么产生的,如果prob只是和NHIST以及n有关,那么m1,m2,m3,..pd,p0,p1都不需要硬件来计算。
 楼主| 发表于 2011-7-10 21:15:45 | 显示全部楼层
回复 4# hover99

没有写错,因为直方图统计的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,请问楼上所说的“不用硬件算出应该如何处理”,指点一下,谢谢
   
发表于 2011-7-10 23:30:00 | 显示全部楼层
第一个for循环中的n有什么作用?
第二个for循环里面的i并没有出现在prob表达式里。
 楼主| 发表于 2011-7-11 12:12:40 | 显示全部楼层
n 是计数,输入多少个pixel,在一楼已经特别注释出来
至于第二个,从vim里粘贴出来的时候漏了,没有检查抱歉。应该是
/* compute probabilities */
  for (i = 0; i < NHIST; i++)
    prob[i] = (double) iHist[i] / (double) n;
发表于 2011-7-11 17:44:41 | 显示全部楼层
It is good to know people is still using VHDL.
 楼主| 发表于 2011-7-17 10:54:11 | 显示全部楼层
继续顶起来,望好心人指点一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-23 05:30 , Processed in 0.022326 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表