在之前一篇,已经在BL808上实现了均值、中值、高斯滤波。
这一篇,我来介绍一下几个已经编译成功,但在BL808上跑不动的代码,称其为屠龙术完全没有问题:
一、漫画效果
通过双边滤波生成漫画效果,其实可以看做是在颜色和距离上分别做了高斯滤波,其滤波系数为颜色和距离的高斯滤波系数乘积,如上一篇介绍,高斯滤波采用的是5*5的窗口,因此离中心点距离只有6种:0(中心点,1个),1(上下左右相邻,4个),根号2(斜方向相邻,4个),2(外圈的上下左右,4个),根号5(外圈非对角的点,8个),根号8(外圈对角,4个),直接在程序中写出来,[36, 24, 16, 6, 4, 1]整数计算后归一。
但颜色的距离有255种,显然不适合全部写出来,因此采用的是放大1000倍后计算,所以使用序列[1000, 988, 951, 894, 819, 732, 638, 542, 449, 363, 287, 220, 165, 121, 86, 60, 41, 27, 17, 11, 7, 4, 2, 1, 1]查表,如果颜色距离大于25,则直接按0计算。
在BL808上尝试进行3轮双边滤波,就已经完全跑不动了,而希望产生动漫效果,如果使用5*5的窗口,在电脑上尝试,看起来至少需要20轮才行。(调整参数,有可能可以再降低一点,但估计也不会少于10轮。)
二、像素效果
产生像素效果,主要有两种,一种是减色,把256*256*256位色减少到32位或者64位,一方面是相邻像素合并。
像素合并并不耗太多资源,但减色实在太困难了。
因为图片本身就不大,我是直接把相邻4个点直接平均成一个点(其实这已经太简单粗暴了,应该是边缘检测+中值可能更合适)。
减色并不是简单等分256,我采用的方法比较笨,首先是选出所有rgb中颜色差值最大的一种,再通过中位数区分;再递归调用上述方法,进过6轮,所有颜色平分到64组颜色中去了,再把每组颜色中都采用均值,整个图像就变得只有64种颜色了。但实际看起来似乎并没有ps做得好看?
三、肥皂泡效果
肥皂泡效果是早些年婚纱摄影的热门,自从ps兴起之后,似乎渐渐淡出,但用代码实现仍然是热门话题,其实肥皂泡效果是比较容易实现的:
这里先介绍一下hsv,所谓hsv,指的是色调、饱和、明亮度。可以与rgb互转,其公式如下:
当然,我们从图中取得的数据一般是rgb,那么rgb中数值最大的假设叫做max,最小的叫做min则从rgb转成hsv,可以用:
接下来继续讲肥皂泡的构成
1、肥皂泡的边缘
首先肥皂泡一般都是正圆形(当然有异形肥皂泡,这里不讨论),肥皂泡的边缘是高亮,通过调整v值实现。
2、肥皂泡的内部
因为受到肥皂泡的阻挡,透过肥皂泡,图像会略微模糊一点,这个可以使用高斯滤镜实现。同时可能会看到类似彩虹(由红到紫)的衍射花纹叠加在肥皂泡遮挡的物体,这个是通过调整rgb的一种或者两种颜色实现。
另外由于肥皂泡是一个凸透镜,因此还需要基于肥皂泡的中心点作出“鱼眼滤镜”的效果,这个相对简单,只需要把像素增加一个偏移量就行。
3、肥皂泡上的高光区域
肥皂泡上一般还会有一两个高光效果,这个水滴会阻挡一部分后面的物体,但颜色是能够透过来的。这个采用颜色叠加就行,关于颜色叠加,我在之前(https://bbs.eeworld.com.cn/thread-1229447-1-1.html)里面就介绍过,这里稍微有点区别就是叠加白色块的透明度采用指数衰减。
4、碰撞
肥皂泡漂浮在空中,如果两个气泡的中心点距离与它们的半径和相同,则可以认为肥皂泡发生了碰撞,碰撞后的肥皂泡应该被弹开,假设肥皂泡质量相同,那么应该计算总动量不变,总动能不变,即碰撞切线方向速度不变,法线方向速度交换。
感觉肥皂泡效果相对消耗的资源少一点,但不知道为什么开启全效果以后在BL808上仍然跑不起来,附件是一个化简的肥皂泡效果(只有边缘高亮、内部鱼眼、高光块、大小确定),只有一个肥皂泡,移动的路径也基本是相对固定的(单一碰到边缘反弹),因为没有涉及rgb到hsv的转换,看起来基本没什么卡顿,下一步准备增加肥皂泡数量再试试。
PS:电脑仿真效果图
bad22de615b05420b2480ab47de333f1
|