基于FPGA的自适应阈值分割算法实现|源码

前言:
全局阈值分割算法简单,对于双峰直方图图像有很好的分割效果。但对于图像噪声和光照不均匀性十分敏感。如下图所示,是图像的OTSU分割效果。可见,由于边缘光照不均匀性,造成边缘分割失败。图像边缘光线较暗的地方被分割为0,中间较亮的地方分割成功。
基于FPGA的自适应阈值分割算法实现|源码_第1张图片

如何规避光线不均匀带来的影响?一种典型的处理方法就是采用局部自适应阈值分割。根据像素邻域块的像素值分布来确定该像素位置上的二值化阈值。这样做的好处在于每个像素位置处的二值化阈值不是固定不变的,而是由其周围邻域像素的分布来决定的。亮度较高的图像区域二值化阈值通常较高,而亮度较低的图像区域二值化阈值则会相应地变小。不同亮度、对比度、纹理的局部图像区域将会拥有相对应的局部二值化阈值。
常用的局部自适应阈值是局部邻域块的均值和局部邻域块的高斯加权和。将处理窗口设为矩形移动窗,设r为处理窗口的半径,μ为窗口内像素均值,σ2为窗口内像素方差,I(x,y)为输入像素值,g(x,y)为分割后的像素值,K为一个大于0的常数。有如下定义.
基于FPGA的自适应阈值分割算法实现|源码_第2张图片

FPGA实现:
根据上述公式,我们需要做的就是先把公式进行算法转化,为了便于理解,不妨假设目前的输入像素值为din,经算法处理后的输出数据为dout,可得:
公式

代入前面的公式,省略其推导过程,通常情况下,根据不同的图像,K为0~4的常数,这里我们将K取为1.窗口半径取为7,得到最后的推导公式:
在这里插入图片描述
因此,我们可以把FPGA实现分成2个部分实现,一个是左边的不等式计算,一个是右边不等式计算。两者都要使用当前窗口内的计算的像素均值u,如下原理图中的Mean_cal模块。
左边不等式:由于均值计算需要一定延时;因此,需要把当前像素数据raw_data Delay后再与Mean_cal 计算的均值u 相减,然后平方(Square)最后乘以窗口像素个数225(15x15),从而完成左边不等式的计算。
右边不等式:从Win_Buffer获得当前窗口内225个所有像素值,然后与均值之差的平方和,完成不等式右边的计算。
最后,两边不等式比较得到阈值分割结果。
基于FPGA的自适应阈值分割算法实现|源码_第3张图片
仿真结果:
如下如所示,是matlab和modelsim 联合仿真的结果,左边是灰度原图,右边是基于Verilog算法之后 matlab 复现图,可以看出分割的效果还不错。
基于FPGA的自适应阈值分割算法实现|源码_第4张图片
源码获取:关注微信公众号:FPGA自习室 或者 扫描下方知识星球直接获取
基于FPGA的自适应阈值分割算法实现|源码_第5张图片

你可能感兴趣的:(FPGA图像处理)