FPGA图像处理(10)常用算法:图像锐化

版权声明:本文为CSDN博主「bt_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/botao_li

锐化
锐化即在图像上增强显示图像内容的边缘成分。

根据边缘成分的计算方法,常用的方法有高斯滤波锐化和拉普拉斯滤波锐化。

高斯滤波锐化将原始图像 x 减去高斯滤波(相当于低通滤波)后得到的平滑图像 gaussian(x),计算得到边缘图像 z:
z=x−gaussian(x)

拉普拉斯滤波锐化直接使用拉普拉斯滤波(相当于高通滤波)得到边缘成分,典型的拉普拉斯滤波系数如下:

锐化图像的计算公式如下:

上式中 a 值为锐化强度,一般选择范围是 0≤a≤1.50\leq a \leq 1.50≤a≤1.5,为防止出现过度锐化,可以将 a 值取为0.5(经验值,根据图像场景调节)。

上式中 T 值为锐化门限,控制算法只对边缘强度大于 T 值的部分进行锐化,对于平滑区域保持不变,像素位宽为 8 的情况下,可以将 T 值取为8(经验值,根据图像场景调节)。

使用灰度图像,以 3×3 的高斯滤波器为例,说明 FPGA 实现方法,典型的高斯滤波系数如下:

系数矩阵中心的 4 对应的是当前像素点的加权值,则 z 值计算对应的二维卷积核:

在计算 z 值时,即可以使用上方公式直接用二维卷积计算,也可以根据其原理先计算 gaussian(x),再计算 x-gaussian(x)。滤波系数中 2、4 值的乘法可以分别通过低位补 1 位 0 和低位补 2 位 0 的方法实现,第一种方法滤波系数中心的 12,如果不使用乘法器,则需要分解为 ×4\times 4×4和 ×8\times 8×8,再将 2 个积值相加,计算麻烦;先滤波再计算减法的方法则更为简便。

PS:在其它卷积算法中,如果卷积系数比较复杂(不能使用加减或者移位计算),必须使用乘法(甚至除法)的情况下,将卷积计算前后其它的算法合并至卷积系数,用一次卷积完成多个计算步骤,可以减少计算量。

在后续的锐化强度计算中,由于 a=0.5,则 ×a\times a×a 的计算可以用截去低位的办法实现除以 2。

具体的 sysgen 设计如下:

输入图像数据首先进入 3×33\times 33×3二维缓冲:

用移位方法实现卷积系数的乘法计算:

将卷积系数乘法结果相加,并用截去低位的办法实现

锐化计算:

上图中红色高亮区域中实现 a×z的计算,但是将 a 值通过低位补 0 的方式设置为 4,用于增强视觉效果。

如果使用前文所述的 a 值为 0.5 的边缘增强系数,则使用如下所示的模块:

锐化门限控制,T 值为 8,由于是有符号整数补码的绝对值比较,因此分别比较 +8与 -8,再用 or 合并比较结果:

高斯滤波后完整的锐化设计:


仿真结果如下。

试验图片来源于:https://unsplash.com/

输入原始图像:

锐化,参数 a=1,T=0:

锐化,参数 a=16,T=0(为加强锐化效果选择该参数):

最后附上拉普拉斯滤波锐化的输出图像,参数 a=1,T=0,供参考比较:

推荐阅读