【博文连载】行阉割、水平像素镜像的优化版3X3实现
在图像算法中,无论是进行均值滤波、中值滤波,还是Sobel边缘检测算法、腐蚀运算、膨胀运算算法中,我们都是用的到了3X3的矩阵,即教程设计的VIP_Matrix_Generate_3X3_8Bit,关于具体的设计可以在第7.3节“3*3像素阵列的HDL实现”中了解具体的实现方式,本节主要还是应用。
通过VIP_Matrix_Generate_3X3_8Bit,简单的得到了没有经过边缘镜像后的阵列。最后得到的matrix_p11、p12、p13、p21、p22、p23、p31、p32、p33即为得到的3*3像素阵列,仿真时序图如下所示:
从图中第一个像素输出为24’h000001,实际上应该为030103,同时以最后像素为中心的3*3矩阵没有输出。由于前面的算法,均只需要考虑3X3阵列,而不需要考虑像素的奇偶分布坐标,因此认为的忽略边缘,即便最终处理出现了边缘的Bug,我们都将以实现VIP算法为首要目的,而忽略这些细节。但是Bayer阵列需要考虑奇偶像素/行的分布,因此,此处考虑优化的可能性,将行、列边缘像素通过镜像实现,最后输出完整的3X3的阵列。
此处Bingo将介绍通过像素缓存机制实现的行边缘镜像,即通过像素的缓存,延迟到第二个像素时,通过与前面像素的组合,来实现镜像。同时,由于像素的迟滞,我们需要人为的将per_cmos_href扩展一个像素周期,来实现完整的序列操作。
首先,给出像素的行有效周期使能扩展,read_frame_href的生成如下所示:
其次,通过此信号,以及像素计数电路,生成数据的寄存、迟滞,已实现镜像,关键部分代码如下所示:
从上述实现流程分析,在数据读取中,持续的寄存上一列的3个像素,此外根据像素点来分配输出,如下:
(1)当pixel_cnt == 0时,不输出3X3阵列。
(2)当pixel_cnt == 1时,输出镜像后的边缘(第一个)像素3X3阵列
(3)当pixel_cnt == IMG_HDISP,输出镜像后的边缘(最后一个)像素3X3阵列
(4)在1~IMG_HDISP之间,输出当前像素为中心的3X3阵列
这部分行边缘镜像的3X3的实现,波形如下所示:
从图中可见,第一种3X3方案中,第一个3X3阵列为000001,而此时我们已经通过迟滞+镜像法则,第一个像素输出标准的3X3阵列:020101;同时最后一个阵列也OK了。这样,我们便实现了水平方向上的像素镜像。
关于竖直方向上的像素镜像,同样需要一行的迟滞,以实现行的镜像。但由于我们只有480个行信号,因此再通过Shift_RAM之后,还需要认为的生成一个行信号,来补偿镜像输出后的行信号损耗。对于实现难度上基本等于0,但是这一部分的实现,希望读者自己去努力,Bingo点到为止(其实我就是懒!)。