简单处理——二值化(钢笔画)和差分化(浮雕画)
一、钢笔画和浮雕画
RGB转灰度图就类似于英语学习中的abandon,在熟悉了YCbCr等颜色空间以及简单的图像反转之后,我们可以将目光移向今天的主题——二值化和差分化;
二值化概念比较简单,就是你给灰度在0—255的灰度图像设置一个阈值,大于这个阈值就赋值255,小于这个阈值就赋值0,也就是非1即0的二值化;
差分化的概念,差分化也就是浮雕画更侧重于凸显立体感,也就是说要勾勒图像的轮廓并降低周围的像素值,所以在采用相邻两点的像素值差之后加上一个阈值,就可以得到浮雕画效果。
二、MATLAB实现
MATLAB实现是比较简单的,二值化就是设置一个非一即零的阈值,对每个点进行判断;差分化利用公式即可:relief(i,j) = gray( i,j+1 ) -gray( i,j ) + value
实验得到的效果图如下:
三、FPGA实现
对于二值化而言,vga_ctrl模块每每取到一个数据,程序对其与阈值进行判断即可,可用assign语句实现
对于差分化来说,由于设计到了相邻数据,需要一个打拍操作,打一拍之后的数据要滞后于原始数据一拍,行场同步信号也需要进行相应的打拍对齐。
四、上板调试
可以看到,实验结果符合预期,记录一个问题,在上面value的调节过程中,之前的按键调节阈值发生了失败现象。我尝试对之前错误的代码进行复现,发现错误出现在这一部分
图中注释掉的是原来可以正常运行的代码,这个地方引发的思考是关于循环嵌套的思考,硬件描述语言不同于c语言等编程语言,很简单的循环嵌套可能造成相邻两个D触发器之间的组合逻辑太过复杂,可能引发时序上的冲突