锐化

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

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

高斯滤波锐化将原始图像 x 减去高斯滤波(相当于低通滤波)后得到的平滑图像 gaussian(x),计算得到边缘图像 z:
z=xgaussian(x) z=x-gaussian(x)
拉普拉斯滤波锐化直接使用拉普拉斯滤波(相当于高通滤波)得到边缘成分,典型的拉普拉斯滤波系数如下:
(010141010) \left( \begin{array} {ccc} 0&-1&0\\ -1&4&-1\\ 0&-1&0 \end{array} \right)

(111181111) \left( \begin{array} {ccc} -1&-1&-1\\ -1&8&-1\\ -1&-1&-1 \end{array} \right)

锐化图像的计算公式如下:
y={x+a×zz>TxzT y=\begin{cases} x+a\times z & \lvert z\rvert>T\\ x&\lvert z\rvert\leq T \end{cases}
上式中 a 值为锐化强度,一般选择范围是 0a1.50\leq a \leq 1.5,为防止出现过度锐化,可以将 a 值取为0.5(经验值,根据图像场景调节)。

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

使用灰度图像,以 3×33\times 3 的高斯滤波器为例,说明 FPGA 实现方法,典型的高斯滤波系数如下:
116×(121242121) \frac{1}{16}\times\left( \begin{array} {ccc} 1&2&1\\ 2&4&2\\ 1&2&1 \end{array} \right)
系数矩阵中心的 4 对应的是当前像素点的加权值,则 z 值计算对应的二维卷积核:
116×(1212(164)2121) \frac{1}{16}\times\left( \begin{array} {ccc} -1&-2&-1\\ -2&(16-4)&-2\\ -1&-2&-1 \end{array} \right)
在计算 z 值时,即可以使用上方公式直接用二维卷积计算,也可以根据其原理先计算 gaussian(x),再计算 x-gaussian(x)。滤波系数中 2、4 值的乘法可以分别通过低位补 1 位 0 和低位补 2 位 0 的方法实现,第一种方法滤波系数中心的 12,如果不使用乘法器,则需要分解为 ×4\times 4×8\times 8,再将 2 个积值相加,计算麻烦;先滤波再计算减法的方法则更为简便。

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

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

具体的 sysgen 设计如下:

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

FPGA图像处理10_常用算法_图像锐化

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

FPGA图像处理10_常用算法_图像锐化

将卷积系数乘法结果相加,并用截去低位的办法实现 ×116\times\frac{1}{16}

FPGA图像处理10_常用算法_图像锐化

锐化计算:

FPGA图像处理10_常用算法_图像锐化

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

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

FPGA图像处理10_常用算法_图像锐化

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

FPGA图像处理10_常用算法_图像锐化

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

FPGA图像处理10_常用算法_图像锐化

仿真结果如下。

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

输入原始图像:

FPGA图像处理10_常用算法_图像锐化

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

FPGA图像处理10_常用算法_图像锐化

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

FPGA图像处理10_常用算法_图像锐化

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

FPGA图像处理10_常用算法_图像锐化

相关文章: