在前面讲的自适应分割的原理如下:
由公式可以看出,窗口的分割值是对图像进行开窗,并计算窗口内的像素均值和标准差,分割值为像素均值和标准差的加权和。
在软件中,不考虑计算效率的情况下,这个计算是轻而易举的事情。但是,需要注意到,在计算分割值的过程中,首先要计算窗口内像素的方差,然后才能对方差进行开方计算标准差。在FPGA里面计算开方是一件费时费力的工作,所以对不等式进行一个等价转换。
为了便于理解,不妨假设目前的输入像素值为din,经算法处理后的输出数据为dout,
这样就只需要得到当前数据din,计算当前窗口内均值和方差即可,这样就可以避免开方操作,简化了系统设计。
将δ2带入上述公式中,则有
若取r=7,K=1,则上式转化为
FPGA需要完成一下计算工作:
1) 计算当前窗口内的像素均值μ。
2) 计算当前窗口中心像素与均值之差的平方(din-μ)2。
3) 将上式与255相乘,完成不等式左边的计算。
4) 计算当前窗口内255个像素值与均值之差的平方和,完成不等式右边的计算。
5) 比较(3)和(4)结果,完成图像分割。
6) 完成行列对齐与边界处理。
根据以上设计步骤,给出FPGA的顶层设计框图如下:
由图可以看出,要完成图像的局部高斯分割工作,需要调用一个均值计算模块mean_2d来计算当前窗口内的像素均值μ。
同时,为了在“同一时刻”计算出当前窗口内所有像素与窗口均值的差平方,还必须要对以前像素为中心的窗口的所有255个像素进行缓存。对15x15个像素的缓存不是一件非常容易的事,这里将指定尺寸的窗口缓存封装成一个模块,记为win_buf,把这个模块的当前输出像素记为din_buf。
不等式左边的计算比较简单,窗口缓存的中间值即为当前像素值,记为din_org,与均值做减法,求平均后再乘以255即可得到。
现在得到了窗口均值μ和当前窗口的像素队列255个din_buf,需要做的是把窗口内255个din_buf分别与均值相减后计算平方。接下来的工作就是把上面这255个差平方结果求和。同样的,15x15个数的加法运算也是非常麻烦的,这里也会将其封装成一个模块,记为add_tree。最后将不等式进行比较,利用比较结果对原图像进行分割即可。