基于OpenCV实现的图像油画效果代码(高效率、低耗时的C++代码-带详细注释)

油画的特点是其颜色值很有限,并且笔比较粗,所以我们要实现油画效果关键就是利用运算实现这两点。

本文实现的图像油画效果代码原理如下:

一、将原图进行灰度化处理后将灰度值线性压缩到0~level,得到图像A;

二、用一个窗去遍历中图像A中的每一个像素,统计出窗覆盖区域出现次数最多的灰度等级,并记录下具体出现的次数,并记为most_times,同时把原图中的BGR三通道像素值分别累加,用BGR三通道累加和除以most_times,得到一个平均BGR值,用这个平均BGR值作为目标图像中对应像素的值。

三、重复上面的过程直到遍历完毕图像A,就得到了油画效果的图像。

从上面的原理叙述来看,原理不难,但问题就在于如何高效的实现?这里面循环比较多,计算量也比较大,如果不作优化,那么程序会耗时不少。比如博文https://blog.youkuaiyun.com/nominior/article/details/82954961提供的代码就因耗时太多而基本无法用。

结合算法原理中累加的特点,对窗作蛇形移动,蛇形移动的过程如下:
在这里插入图片描述
每次蛇形移动时把新增的列值加入上次统计结果,同时把尾巴一列的值减去,这样就可以将算法复杂度由O(n^2) 降低到 O(2n),使得代码运行的时间大大降低。

按以上思路进行优化后,用300×300的图片进行测试…测试结果如下:
在这里插入图片描述
由于代码是自己花时间来精力慢慢写出来的,所以需要的朋友麻烦花费1.9元付费下载,代码中我写了详细的注释,大家一看便懂。
下载链接:https://download.youkuaiyun.com/download/wenhao_ir/85704781
对于这个代码,购买之后阅读和使用过程中有任何疑问,都可以私信我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值