当初做这个算法时,参考的是相机360中的卡通特效。实际查找资料时,我看很多资料也把这种效果称为矢量风格画,严格意义讲,我也说不上来到底该叫什么。找了些资料,也没有找到准确的定义。况且我做的效果,和矢量风格画以及卡通画还有些差距,说白了,并不是那么像。不过,虽然不像,但从效果上,我觉得各有千秋吧,实际对比发现,有些图片处理后,效果要优于相机360中的效果。
       计算过程主要在y通道进行。如果在rgb空间分三个通道处理,计算过程将会非常耗时,所以需要由rgb空间转换至yuv空间,单独对y通道进行处理,最后在变换回rgb空间进行显示、输出。下面把算法大体描述一下。rgb转yuv,得到y通道,单独对y通道做边缘检测,然后计算结构张量,得到整幅图像的矢量场,即计算每个像素点的水平分量及垂直分量。有了矢量场,就可以调用线积分卷积算法进行滤波,得到具有手绘风格的笔触效果。在由yuv空间转回rgb空间过程中,还可以根据不同需求,生成不同风格的结果图,比如黑白图,彩色图等。
       下面贴出算法整体调用逻辑代码,基本可以了解本文提出的卡通画特效算法思路。
void* ImageVectorStylizationThread(void *arg)
{VectorStylizationInfo *vecstylization_info = (VectorStylizationInfo *)arg;BMPINFO *pSrcBitmap = vecstylization_info->pSrcBitmap;int style_index = vecstylization_info->style_index;int color_index = vecstylization_info->color_index;int thread_id = vecstylization_info->thread_id;int width = pSrcBitmap->lWidth;int height=  pSrcBitmap->lHeight;int size = width*height;int mem_size = size * sizeof(float);float *rdata = (float *)malloc(mem_size);float *gdata = (float *)malloc(mem_size);float *bdata = (float *)malloc(mem_size);float *ydata = (float *)malloc(mem_size);float *udata = (float *)malloc(mem_size);float *vdata = (float *)malloc(mem_size);// 数据转换ConvertToFloat(pSrcBitmap, rdata, gdata, bdata);// rgb转yuvfor (int i = 0; i < size; i++){Rgb2Yuv(rdata[i], gdata[i], bdata[i], &ydata[i], &udata[i], &vdata[i]);}// 抽取边缘float *edgedata = (float *)malloc(mem_size);ExtractEdge(ydata, edgedata, width, height, 15.7f, 0.017f, 105.5f);// 计算矢量场float *vec_x = (float *)malloc(size * sizeof(float));float *vec_y = (float *)malloc(size * sizeof(float));CalcVectorField(ydata, width, height, vec_x, vec_y, 1.5f);// 线积分卷积LICFilter(edgedata, ydata, vec_x, vec_y, width, height);free(vec_x);free(vec_y);vec_x = NULL;vec_y = NULL;free(edgedata);edgedata = NULL;// 输出结果switch (style_index){case 0:// 黑白memcpy(rdata, ydata, mem_size);memcpy(gdata, ydata, mem_size);memcpy(bdata, ydata, mem_size);ConvertToUchar(rdata, gdata, bdata, pSrcBitmap);ImageBlend(pSrcBitmap, 0, 0);break;case 1:// 单彩memcpy(rdata, ydata, mem_size);memcpy(gdata, ydata, mem_size);memcpy(bdata, ydata, mem_size);ConvertToUchar(rdata, gdata, bdata, pSrcBitmap);ImageBlend(pSrcBitmap, 0, 0);ImageBlend(pSrcBitmap, 1, color_index);break;case 2:// 多彩for (int i = 0; i < size; i++){Yuv2Rgb(ydata[i], udata[i], vdata[i], &rdata[i], &gdata[i], &bdata[i]);}ConvertToUchar(rdata, gdata, bdata, pSrcBitmap);ImageAdjust(pSrcBitmap);break;default:break;}free(ydata);free(udata);free(vdata);ydata = NULL;udata = NULL;vdata = NULL;free(rdata);free(gdata);free(bdata);rdata = NULL;gdata = NULL;bdata = NULL;return NULL;
}
       同样,本算法也是有局限性的,对于背景与前景简单一些的图效果比较好,如果图像背景或者前景比较杂乱,生成的结果可能不太理想。下面是一些效果图:
             
                                                                  
                
                
                
                
                
                
                
                
                
       欢迎下载示例demo:http://download.csdn.net/detail/u013085897/9747177,另外本算法已经集成进我的安卓应用《铅笔画》, 大家有兴趣可以到360、安卓、安智等商店下载使用。

卡通画(矢量风格画)特效生成算法相关推荐

  1. 基于L0范数平滑的图像漫画特效生成算法

           图像漫画特效算法,主要思路可以分两部分,第一,简化图像,即去除图像细节,仅保留图像主要信息,第二,生成合适的边缘线条,最后将两者合成即可,合成其实就是将两者简单一乘即可.在简化图像步骤, ...

  2. 图像处理之水彩画特效生成算法

           在研究非真实感绘制相关算法时,水彩画算法是第一个开始看的,不过却拖到最后总结.水彩画还是挺不好模拟的,里面涉及的算法比较多,本文实现的水彩画算法主要参考下面两篇文章,<Intera ...

  3. matlab画梅花,基于Matlab图像素描生成算法究.doc

    毕 业 文 图像素描生成算法研究 姓 名 院(系) 信息学院 专业班级 学 号 指导教师 职 称 论文答辩日期 年月日 摘 要 分析比较图像处理提供参考.关键词: 目 录 1 前言1 1.1 课题研究 ...

  4. 无需向量监督的矢量图生成算法,入选CVPR 2021 | 代码开源

    说起图像生成算法,大家也许并不陌生. 不过,大多数算法都针对栅格图像,也就是位图,而不支持矢量图. 虽然也有一些生成矢量图形的算法,但是在监督训练中,又受限于矢量图数据集有限的质量和规模. 为此,来自 ...

  5. 开源 | CVPR 2021无需向量监督的矢量图生成算法

    点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:量子位 AI博士笔记系列推荐 周志华<机器学习>手推笔记正式开源!可打印版本附pdf下载链接 说起 ...

  6. 这个开源项目绝绝子,一键生成好玩的矢量风格头像!

    今天是开源项目推荐专题(这个专题终于更新了,勿催哈 :D 最近逛 GitHub,发现了一个非常好玩的开源项目--头像生成器,给大家分享一下~ 开源项目介绍 这是一款开源的矢量风格头像生成器,可以搭配不 ...

  7. 复现个有趣的算法:铅笔素描画自动生成

    导 语 最近偶然翻到一篇来自港中文的paper,十分有意思,可以根据拍摄到的2D图像自动生成该图的铅笔素描画.随手复现了一下,在这里分享给大家.让我们愉快地开始吧~ 开发工具 Python版本:3.6 ...

  8. c语言计算机图形来画八分画圆,【计算机图形学】基本图形元素:圆的生成算法...

    08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...

  9. 绕线画算法python_一种绕线画自动生成及加工的方法和设备与流程

    本发明涉及技术领域,具体涉及一种绕线画自动生成及加工的方法和设备. 背景技术: 绕线画又称钉子画,简而言之,就是在木板上钉上钉子,然后在钉子间绕线,做出大概的轮廓,然后用线在钉子之间缠绕,组成几何图形 ...

最新文章

  1. 常见挖矿 cpu 算力单位:EH/s 、PH/s、TH/s、Msol/s、Mgps、Kgps
  2. ios 性能优化(一)
  3. C/C++程序基础 (八)数据结构
  4. 生产系统支撑终端故障处理的三个误区
  5. springmvc+jsp引用本地图片文件
  6. golang 释放内存机制的探索
  7. Sharepoint2007个人网站不能同步域信息的处理方法
  8. VisualSVNServer的使用
  9. 抽取类的#技巧#成员变量最可能
  10. 【算法】二进制 与、或、异或运算
  11. 【elasticsearch】ES数据库重建索引 -- Reindex(数据迁移)
  12. 高级工计算机操作试题及答案,计算机系统操作高级工试题和答案[1]
  13. JavaScript定位页面元素属性(满满的干货)
  14. 交互设计—超越人机交互(第5版)
  15. 20大中国式弱点营销
  16. C 语言绝对值函数abs实现技巧
  17. python 钉钉发邮件报警设置
  18. Vant组件NavBar导航栏使用时去除下方白线问题
  19. 关于Java对接读卡器遇到的坑Process finished with exit code -1073740940 (0xC0000374)
  20. [ATPG]解读report_nonscan_cells -summary得到的report

热门文章

  1. 由ISBN自动获取书籍信息——下载可用
  2. 【Python公开课】零基础玩转Python:Python中的文件操作
  3. 共识游戏:特斯拉和软银谁更会打麻将?
  4. Acwing 2326:王者之剑(网格图之网络流 最大权独立集)
  5. 移印工艺流程及应用注意事项
  6. ThinkPad安装Windows XP系统BIOS配置
  7. 蓝叠模拟器Installation did not succeed. Installation failed due to: 'closed'
  8. JavaScript学习笔记_5 Map
  9. #软件技术 常用软件与资源网站
  10. 8.14 猪王争霸 2693