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

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

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

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

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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/wenhao_ir/article/details/125363431
今日推荐