2284|6

402

帖子

9

TA的资源

纯净的硅(初级)

楼主
 

放在BL808开发板上屠龙计 [复制链接]

 

在之前一篇,已经在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

 

最新回复

EFT
不错,我要去试试看能不能还原作者的过程,有的话,太谢谢啦   详情 回复 发表于 2024-5-15 12:49
点赞 关注(1)
 
 

回复
举报

402

帖子

9

TA的资源

纯净的硅(初级)

沙发
 

另外请教大家两个个非常基础的问题:

1、在开发板上,rand的种子应该怎么设啊?

因为板子启动时间基本是不变的,初始化的时候就算调用了srand(time(0)),但感觉还是一样的初始化值。。。

2、怎么把一串数字等分啊?

这是我在像素化图像里面碰到问题,我希望把颜色一分为二,用的方法超级笨,先冒泡排序,再各取一半,效率似乎非常低。

点评

单片机随机数: 1. 内部硬件随机数生成器 2. ADC的温度通道,取最低bit,取多次后,混合为一个随机数 3. ADC的外部通道,取最低bit,取多次后,混合为一个随机数 4. 若与其他设备通信,取通信tick点,根  详情 回复 发表于 2022-12-31 17:53
 
 
 

回复

402

帖子

9

TA的资源

纯净的硅(初级)

板凳
 

负片效果:蓝香蕉和阿凡达之手:

 
 
 

回复

750

帖子

3

TA的资源

版主

4
 
tobot 发表于 2022-12-31 15:57 另外请教大家两个个非常基础的问题: 1、在开发板上,rand的种子应该怎么设啊? 因为板子启动时间基 ...

单片机随机数:

1. 内部硬件随机数生成器

2. ADC的温度通道,取最低bit,取多次后,混合为一个随机数

3. ADC的外部通道,取最低bit,取多次后,混合为一个随机数

4. 若与其他设备通信,取通信tick点,根据情况取最低一个或多个bit

以上方法的随机数安全性递减

 

点评

不错不错,只是在BL808的板上好像不太适合,不过提醒我了,可以读外部第一个wifi的mac最后一位作为种子  详情 回复 发表于 2022-12-31 21:06
个人签名

要666

 
 
 

回复

402

帖子

9

TA的资源

纯净的硅(初级)

5
 

不错不错,只是在BL808的板上好像不太适合,不过提醒我了,可以读外部第一个wifi的mac最后一位作为种子

点评

808不是有AD吗,不能读温度?  详情 回复 发表于 2023-1-1 08:15
 
 
 

回复

750

帖子

3

TA的资源

版主

6
 
tobot 发表于 2022-12-31 21:06 不错不错,只是在BL808的板上好像不太适合,不过提醒我了,可以读外部第一个wifi的mac最后一位作为种子

808不是有AD吗,不能读温度?

个人签名

要666

 
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

7
 

不错,我要去试试看能不能还原作者的过程,有的话,太谢谢啦

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表