铅笔特效算法

铅笔特效方面的算法很多,像photoshop这种牛逼软件具有这个功能就不足为奇了。偶尔闲来无事,收集一些这方面的资料,觉得蛮有意思的。最近看到一篇香港中文大学贾佳亚教授的paper,当然他只是挂个名,因为他不是第一作者,应该是他学生的作品。废话不多说,这篇paper的题目是“Combining Sketch and Tone for Pencil Drawing Production”。看到这篇paper的实现效果,简直让人惊呆了。这是我见过的最好的铅笔特效算法,没有之一。文章的原理也很简单。希望感兴趣的朋友去下来研究研究。你值得拥有!

下面贴出自己的代码 ,甚为粗糙,还望看官莫要见笑。

 1 clear all;
 2 close all;
 3 clc;
 4 ks=10;
 5 dirNum=8;
 6 [FileName,PathName]=uigetfile({‘*.jpg‘;‘*.png‘;‘*.bmp‘},‘Open an Image File‘);
 7 Img=imread([PathName FileName]);
 8 figure,imshow(Img);
 9 [H, W, sc] = size(Img);
10     if sc == 3
11         I = rgb2gray(Img);
12     end
13 PC = phasecongmono(I, 5, 3, 2.5, 0.55, 2.0);
14 figure,imshow(PC);
15 PC=PC.^0.65;
16
17 %% convolution kernel with horizontal direction
18     kerRef = zeros(ks*2+1);
19     kerRef(ks+1,:) = 1;
20
21 %% classification
22     response = zeros(H,W,dirNum);
23     Sresponse = zeros(H,W,dirNum);
24     for ii = 0 : (dirNum-1)
25         ker = imrotate(kerRef, ii*180/dirNum, ‘bilinear‘, ‘crop‘);
26         response(:,:,ii+1) = conv2(PC, ker, ‘same‘);
27     end
28     [~ , index] = sort(response, 3);
29     Dirs = (index(:,:,end)-1)*180/dirNum;
30     maxindex=index(:,:,end);
31     C = zeros(H,W,dirNum);
32     for k=1:dirNum
33     for i=1:H
34         for j=1:W
35             if(maxindex(i,j)==k)
36                 C(i,j,k)=PC(i,j);
37
38             end
39         end
40     end
41     end
42 Cresponse = zeros(H,W,dirNum);
43 for jj = 0 : (dirNum-1)
44         ker = imrotate(kerRef, jj*180/dirNum, ‘bilinear‘, ‘crop‘);
45
46         Cresponse(:,:,jj+1) = conv2(C(:,:,jj+1), ker, ‘same‘);
47 end
48 S=0.079*Cresponse(:,:,1)+0.079*Cresponse(:,:,2)+0.079*Cresponse(:,:,3)+0.079*Cresponse(:,:,4)+0.079*Cresponse(:,:,5)+0.079*Cresponse(:,:,6)+0.079*Cresponse(:,:,7)+0.079*Cresponse(:,:,8);
49 figure,imshow(1-S);
50 a=0:255;
51 p1 = 1/9*exp(-(255-a)/9);
52 p3=1/sqrt(2*pi*11) * exp(-(a-90).*(a-90) / (2.0*11*11));
53 p2= 0:255;
54 p2(:)=1/(225-105);
55 p2(1:55)=0;
56 p2(225:256)=0;
57 p = 0.76 * p1 + 0.22 * p2 + 0.02 * p3;
58 figure,plot(a,p);
59 hgram=round(p*H*W);
60
61 Inew=histeq(uint8(I),hgram);
62 H=fspecial(‘gaussian‘,13,2);
63 Inew = imfilter(Inew,H,‘replicate‘);
64 Inew=double(Inew);
65 Sn=1-mapminmax(S);
66 out=Inew.*Sn*0.55;
67 figure,imshow(uint8(out));

需要提醒的是,本代码未能实现texture rendering的步骤,所以效果与文章还是有一定差距的。

时间: 2024-10-13 05:18:12

铅笔特效算法的相关文章

Android 算法 水纹

基础知识: 在讲解代码之前,我们来回顾一下在高中的物理课上我们所学的关于水波的知识.水波有扩散,衰减,折射,反射,衍射等几个特性: 扩散 : 当你投一块石头到水中,你会看到一个以石头入水点为圆心所形成的一圈圈的水波,这里,你可能会被这个现象所误导,以为水波上的每一点都是以石头入水点为中 心向外扩散的,这是错误的.实际上,水波上的任何一点在任何时候都是以自己为圆心向四周扩散的,之所以会形成一个环状的水波,是因为水波的内部因为扩散的 对称而相互抵消了. 衰减 :因为水是有阻尼的,否则,当你在水池中投

PhotoShop 图像处理 算法 汇总

不定期更新 ...... 直接点标题即可链接到原文. 图层混合算法: PS图层混合算法之一(不透明度,正片叠底,颜色加深,颜色减淡) PS图层混合算法之二(线性加深,线性减淡,变亮,变暗) PS图层混合算法之三(滤色, 叠加, 柔光, 强光) PS图层混合算法之四(亮光, 点光, 线性光, 实色混合) PS图层混合算法之五(饱和度,色相,颜色,亮度) PS图层混合算法之六(差值,溶解, 排除) 图像调整算法: 色彩转换--RGB & HSV 色彩转换--RGB & HSL 色彩转换--RG

CSDN日报20170509 ——《互联网时代架构师的职责与思考》

[程序人生]互联网时代架构师的职责与思考 作者:木小鱼 在当下的互联网时代,架构师是互联网行业的热点关键词,人云亦云者居多,那互联网架构师到底是做什么的,如何来评价互联网架构师的优劣呢? 点击阅读全文 [Android]手把手教你构建 Android WebView 的缓存机制 & 资源预加载方案 作者:Carson_Ho 由于H5具备 开发周期短.灵活性好 的特点,所以现在 Android App大多嵌入了 Android Webview 组件进行 Hybrid 开发,但我知道你一定在烦恼 A

什么样的图像算法容易推广到视频?

图像有很多特效算法,比如素描,油画,浮雕等等. 视频也是由一帧帧图像组成的,没错, 这些算法是可以用于视频,先把视频逐帧解出来,每帧都用算法处理一下,再重新编码封装即可. 但是,别忘了视频是运动图像,它在内容上是连续的,是线性变化的. 所以,图像算法要推广到视频,基本的前提就是它是一个线性的处理.即对于线性变化的运动图像,得到的结果也是线性变化的.这样处理完的视频,看上去就会连续,是叠加了图像处理的视频,因为视频的"内容"没有被打乱. 比如对于一些有随机算法的图像处理,就不适合这个转换

Java中关于先有鸡还是先有蛋的问题----Class&Object

在Java中,我们常常会看到一个类型:Class.并且在类似Person.class,cache.getClass()等代码中见到它的身影. 众所周知,Class是用来描述一个类的类型,而Object是所有对象的最终父对象.那么就会引申出下边的两个结论: 1.如果从对象的角度来看,那么肯定是先有Object对象,其次才有其派生的对象Class. 2.Class表示的是类.对象,肯定是先有类这个概念,其次才有各个类型(抽象的.非抽象的),包括Object. 这就会出现一个问题,到底是先有Class

学计算机的值得一看的文章,跟帖也很有水平啊

转自http://blog.csdn.net/Xviewee/article/details/1606247 回复CSDN和KAOYAN诸位网友的几点看法,(为避免吵架,郑重声明,本人不是高手,只是有感而发的一点个人陋见,欢迎指正,事先感谢): 就我自己的理解,谈谈我对读研和软件学院的看法,不妥之处一笑了之即可. 如果你有实际开发工作经验,感觉自己的水平和实力进入了一个高原期,迫切需要从理论上提高,那么计算机学院是唯一选择.因为计算机学院才能让你在理论上更上一层楼.软件学院从教学计划上就没有

攻读研究生的想法(很不错)

谈谈我对攻读计算机研究生的看法(转载的)                                                                                                                                                       作者:eqingsheng 就我自己的理解,谈谈我对读研和软件学院的看法,不妥之处一笑了之即可.  如果你有实际开发工作经验,感觉自己的水平和实力进入了一个高

Qt Quick 图像处理实例之美图秀秀(附源码下载)

在<Qt Quick 之 QML 与 C++ 混合编程详解>一文中我们讲解了 QML 与 C++ 混合编程的方方面面的内容,这次我们通过一个图像处理应用,再来看一下 QML 与 C++ 混合编程的威力,同时也为诸君揭开美图秀秀.魔拍之类的相片美化应用的底层原理. 项目的创建过程请参考<Qt Quick 之 Hello World 图文详解>,项目名称为 imageProcessor ,创建完成后需要添加两个文件: imageProcessor.h 和 imageProcessor.

duilib制作窗体动画效果

转载请说明原出处,谢谢~·http://blog.csdn.net/zhuhongshu/article/details/49026605 最近一段时间没写博客了,感觉最近没有遇到什么必须解决的bug.在一年前我把自己写的仿酷狗音乐播放器Demo写到博客时,我在博客末尾写过以后会做异形窗体和窗体动画的功能.异形窗体在半年前大概做完并且集成到我的库里了,但是窗体动画Demo没有写到博客.之前就有网友问我窗体动画的制作方法,一直懒着没写,不好意思···. 今天把窗体动画的制作思路和Demo说明一下.