微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 请教关于fpga图像阈值处理

请教关于fpga图像阈值处理

时间:10-02 整理:3721RD 点击:
最近尝试着用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;
  }

用状态机控制。
第一个状态做
    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.

继续顶起来,望好心人指点一下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top