[发布]Photoshop油画效果滤镜hoodlum1980

Languagesmainlyusinganddigging:C/CPP,ASM,C#,Python.Otherlanguages:Java.

(1)对油画滤镜的算法的概念性描述

这是我通过阅读FilterExplorer源码后得到的理解。该滤镜有两个参数,一个是模板半径(radius),则模板尺寸是(radius*2+1)*(radius*2+1)大小,也就是以当前像素为中心,向外扩展radius个像素的矩形区域,作为一个搜索范围,我们暂时将它称为“模板”(实际上该算法并不是例如高斯模糊,自定滤镜那种标准模板法,仅仅是处理过程类似,因此我才能实现稍后介绍的优化)。

另一个参数是光滑度(smoothness),实际上他是灰度桶的个数。我们假设把像素的灰度/亮度(0~255)均匀的分成smoothness个区间,则每个区间我们在此称它为一个桶(bucket),这样我们就有很多个桶,暂时称之为桶阵列(buckets)。

该算法遍历图上的每个像素,针对当前位置(x,y)像素,将模板范围内的所有像素灰度化,即把图像变成灰度图像,然后把像素值进一步离散化,即根据像素的灰度落入的区间,把模板内的像素依次投入到相应的桶中。然后从这些桶中找到一个落入像素个数最多的桶,并对该桶中的所有像素求出颜色平均值,作为位置(x,y)的结果值。

上面的算法描述,用下面的示意图来表示。中间的图像是从原图灰度化+离散化(相当于Photoshop中的色调分离)的结果,小方框表示的是模板。下方表示的是桶阵列(8个桶,即把0~255的灰度值离散化成8个区间段)。

(2)对老外已有代码的效率的改进

2.1为此,我的第一个改进是在PS中把当前的整个图像贴片进行灰度化并离散化(投入桶中),这样在用模板遍历贴片时,就不需要重复性的计算灰度并离散化了。这样大概把算法的运行速度提高了一倍左右(针对某个样本,处理速度从20多秒提高到10秒左右)。

2.2但这样对速度的提高仍不够显著。因此我进行另一项更重要的优化,即把针对模板尺寸的复杂度从平方降低到线性复杂度。这个依据是,考虑模板在当前行间从左向右逐格移动,模板中部像素(相邻两个模板的交集)在结果中的统计数据是不变的。仅有最左侧一列移出模板,最右侧一列进入模板,因此我们在遍历图像时就不必管模板中部像素,只需要处理模板的两个边缘即可。如下图所示(半径为2,模板尺寸是5*5像素):

【注意】我能做到这样的优化的原因是该滤镜算法并不是标准的模板算法,它的本质是求模板范围内的统计信息,即结果和像素的模板坐标无关。这就好像是我们想得到某局部范围的人口数,男女比例等信息一样。因此我们按以上方法进行优化。

模板移动的轨迹是蛇形迂回步进,例如:

→→→→→→→

←←←←←←←

→→...

下面我将给出本滤镜的核心算法的代码,位于algorithm.cpp中的全部代码:

2.3原有代码对半径的范围限制是(1~5),由于我优化了代码,所以我把半径的区间可以大大提高,我把半径设置到100时我发现半径太大没什么意义,因为基本已经看不出原图是什么了。

【总结】改进后的代码的更具技巧性和挑战性,包括大量底层的指针操作和不同矩形(输入贴片,输出贴片,模板)之间的坐标定位,代码可读性上可能略有降低,但只要理解上面的原理,代码依然是具有较好的可读性的。此外,我还对该算法的改进想到,把模板从矩形改为“圆形”,以及在遍历图像时,使模板半径和桶个数这两个参数随机抖动,但这些改进都会使2.2中提到的优化失效,会使算法的速度又降回到较低的水平。

(3)用多线程技术提高缩略图显示效率,避免影响UI线程的交互性

下图是在Photoshop中调用此滤镜时,弹出的参数设置对话框。用户可以拖动滑杆控件(TrackBar,又称为Slider),也可以直接在后面的文本框中输入来改变参数。缩略图将实时性的更新已反应新参数。原来的滤镜实现中,我把更新缩略图的处理放在和对话框UI的相同线程内。这样做的话就会引入下面的问题,当用户很快的拖动滑杆控件时,由于参数改变的速度很快,而UI线程可能正忙于处理缩略图数据而短期被“阻塞”,使其不能立即响应后续的控件事件,即表现为滑杆控件的拖动不够流畅,有跳跃,顿挫,迟钝感,对鼠标拖动的反馈不够灵敏。

我把滤镜算法提取出来作为一个共享的函数,这样滤镜的实际处理和更新缩略图可以共享这个函数。在PS实际调用滤镜,以及更新缩略图期间,实际上都要求滤镜算法定期检测“任务取消”事件。例如,在PS调用滤镜时,如果用户按下ESC键,就会立即放弃一个比较耗时的滤镜操作。在更新缩略图时,如果发生UI事件的浪涌,同样要求处理线程能够迅速中止。

在滤镜的核心算法函数中,我定期检测“任务取消”事件,由于在PS调用滤镜时的测试取消和更新缩略图时测试取消的方法不同,因此在滤镜算法函数中,我增加了一个回调函数参数(TestAbortProc)。这样,在PS调用滤镜实际处理时,使用的是PS内置的回调函数去检测取消事件,在更新对话框的缩略图时,我用自己提供的一个回调函数检测取消事件(该函数检测一个布尔变量来获知是否有新的UI事件等待处理)。

改进以后,可以用很快的速度拖动参数对话框上的两个滑竿,尽管这个滤镜核心算法的运算量较大,但我们能看到,参数对话框依然具有很流畅的响应。

(4)缩略图的缩放和平移功能

实际上不管缩放还是平移,更新缩略图的数据本身并不难。难点主要在缩略图的平移,因为涉及到鼠标交互,这需要非常扎实的windows编程技巧和对windows程序底层机制的理解。

缩略图的拖动有以下两种方式:

4.1直接拖动结果图片。

另一种方法是在拖动时把当前结果图进行快照(截屏),然后拖动时,仅仅把截屏结果贴到屏幕相应位置上。这样的效率较高,但缺点是拖动时能看到缩略图旁边有空白部分。这种方法常用语更新视图的成本较大的情况,例如矢量图绘制等。我在这个滤镜中实现的方法属于这种方法。

4.2拖动图片为原始输入图片。

即拖动时,使用的图片是原始数据,而不是结果图片,这也是降低更新数据成本的一种折中方式。例如在Photoshop的内置滤镜高斯模糊中,就是采用这种方法。当拖动缩略图时,显示的缩略图是原图,仅在鼠标释放以后,才显示成预览效果。这样做是比较经济并且有效的。因为我们请求原始数据的成本不高,但用滤镜处理一次缩略图的成本较高。

这里额外提一点技术上的细节,要注意,由于鼠标可能移动到客户区以外(成为负数),这时不能直接使用LOWORD(lParam)和HIWORD(lParam)去获得客户区坐标(因为WORD是无符号数),使用前应该它们转换成有符号数(short)。正确的方法是使用windowsx.h头文件中的宏:GET_X_LPARAM和GET_Y_LPARAM。

(5)该滤镜的下载连接(附件中含有我写的PS插件安装工具,可简化用户安装)

【该插件最近于2013-4-1更新,增强了UI交互性能】

//我开发的PS插件最新合集(含ICO,OilPaint,DrawTable等)

安装后并重启Photoshop以后:

在菜单:滤镜-hoodlum1980-OilPaint中调用该滤镜。

在菜单:帮助-关于增效工具-OilPaint...中可以看到关于对话框(和我开发的ICO文件格式插件的关于对话框的外观几乎一致)。

在菜单:帮助-系统信息中可以看到“OilPaint”一项是否已被加载及其版本信息。

(6)一些不太重要的补充说明

6.2在滤镜核心算法中,为了提高对取消事件的灵敏性,在当前行中我每处理16个像素就检测一次取消(行中像素索引&0x0F==0x0F)。在每行处理结束后(列循环中)也检测一次取消。但这个检测频率略显过于频繁了,过于频繁可能会增大函数调用的成本开销。

6.3采用相同图像,相同参数,我对我的滤镜,FilterExplorer,PhotoSprite三种软件分别处理,然后再在Photoshop中比较。由于我的算法是参考FilterExplorer的源码,并在它的算法上改进而来,因此我的算法和FilterExplorer是等效的,只是效率更高,因此结果完全相同。但我的滤镜以及FilterExplorer的结果,同PhotoSprite相比较总体效果非常接近,但结果有细微的不同。我查看了下PhotoSprite的代码发现,这是在图像灰度化的算法的差异造成的(当我把PhotoSprite的灰度化算法调整为和FilterExplorer中相同后,处理结果就变成相同了)。

在PhotoSprite中,对像素灰度化采用的方法是:gray=(byte)((19661*R+38666*G+7209*B)>>16);

在FilterExplorer/我开发的滤镜中,对像素灰度化采用的方法是:gray=(byte)(0.3*R+0.59*G+0.11*B);

PhotoSprite中的灰度化法将浮点乘法转换成了整数乘法,效率可能会有一点点提高吧,但在此处表现并不显著。

(7)参考资料

7.1FilterExplorer源码。

7.2Photoshop6.0SDKDocuments。

7.3FillRed和IcoFormat插件源码,byhoodlum1980(myself)。

(8)修正历史

8.01[H]修复滤镜在Continue调用中,分配灰度桶内存时,传递的内存大小不正确(错误的设置成灰度化位图的空间大小)的BUG。该BUG容易在以下条件下被触发:文档尺寸太小,或半径参数很小且光滑度参数很大,这些因素可能导致某个贴片过小。这时由于灰度桶空间的分配小于实际需求的大小,则可能后续代码发生内存越界,进而使PS进程意外终止。2011-1-1919:01。

8.02[M]新增缩略图缩放按钮和功能,且优化了放大缩小按钮处理时的代码,降低放大缩小时的闪烁感。2011-1-1919:06。

8.03[M]新增缩略图鼠标拖动功能,且进一步调整了代码,使缩略图矩形固定下来,完全避免了缩放时的闪烁。2011-1-1923:50。

8.04[L]新增功能,当鼠标移动到缩略图上和进行拖放时,光标变成伸开/抓住的手形。这是通过调用PS中的SuitePEAUIHookssuite中的函数实现的,即在缩略图上看到的是PS内部的光标。2011-1-201:23。

8.05[M]修复在参数对话框上点击放大,缩小按钮时,半径参数折算的不正确的BUG。此BUG使点击放大缩小按钮后,缩略图的显示不准。2011-1-201:55。

8.06[L]把关于对话框上的网址链接调整为SysLink控件,这样可以大大简化关于对话框的窗口过程代码。2011-1-2018:12。

8.07[L]更新插件安装辅助工具,使它可以一次安装多个插件。2011-1-2021:15。

8.08[L]由于缩放缩略图时计算有误差(原因不详,可能是因为浮点计算误差),可能使靠近边缘的右下角图像无法平移到缩略图视图中,因此对平移范围新增误差缓冲。2011-1-27。

8.09[L]美化:把滤镜参数对话框的放大缩小按钮,改为使用DirectUI技术实现(新增一个类CImgButton),其界面效果比用原始按钮控件更好。2011-2-14。

8.10[M]性能:调整了插件在参数对话框时,调节半径和光滑度参数的滑竿的交互性能。2013-4-1。

THE END
1.[油画工具]图片免费下载油画工具素材油画工具模板千图网为您找到544张油画工具相关素材,千图网还提供油画工具图片,油画工具素材, 油画工具模板等免费下载服务,千图网是国内专业创意营销服务交易平台,一站式解决企业营销数字化、协同化,实现营销转化效果增长!https://m.58pic.com/tupian/youhuagongju.html
2....调色剂油画工具油画材料下单备注规格价格品牌图片评论法国贝碧欧 油画颜料松节油调色油清洗剂稀释剂去污洗笔液小瓶子上光油500ml媒介剂调色剂油画工具油画材料下单备注规格 0条评论 当当价 降价通知 ¥ 97.00-¥185.00 配送至 福建泉州市 至 北京市东城区 服务 由“泉州淘金猫家具店”发货,并提供售后服务。 http://product.dangdang.com/11869281405.html
1.油画工具推荐新手画油画需要准备哪些工具油画入门工具大全油画是绘画种类中的主要画种之一,也是人们比较熟知的。学习油画不仅仅是兴趣爱好,更是享受在绘画中的乐趣,那么, 油画工具有哪些呢?新手画 油画需要准备哪些工具呢?下面,maigoo小编为大家解析油画入门必备工具大全及其选购指南,包括油画笔、油画颜料、油画刀等等,让艺术走进生活! 油画笔 油画笔按照材料特性主要分成两种...https://www.maigoo.com/goomai/202664.html
2.微信/QQ头像想换成神仙油画风,用这个神器一键转换!有氧周末提供方式:在线工具 最近又发现了一些好玩的东西。大家都知道这两年复古风当道,复古滤镜啥的数不胜数。 前段时间Facebook就兴起了一股18世纪风格的油画像风,IG上一堆人在玩,不用多久,这阵文艺复兴风就漂洋过海吹来国内了。 没错,2020年春天掀起的这阵风就是——AI油画风。 https://www.shangyexinzhi.com/article/4881852.html
3.DynamicAutoPainterPro照片转换油画工具怎么用Dynamic...Dynamic Auto Painter Pro是一款功能齐全,简易好用的照片变换油画工具,软件能够协助客户轻轻松松将照片全自动变为油画风格美术作品的图象处理软件,只需客户导进图象,选择内嵌的多种多样油画风格ps滤镜,便可得到 变换后的实际效果。 【功能介绍】 真实的世界的艺术大师设计灵感技术性 ...https://xiazai.zol.com.cn/baike/503360.shtml
4.DynamicAutoPainterPro下载照片转换油画工具v5.2软件介绍 Dynamic Auto Painter Pro是一款功能强大、简单易用的图片转油画软件,使用这款软件用户可以将添加到软件上的图片转换为油画,该软件内置多种优化素材模板,点击即可进行使用,内置有强大的优化自动绘画功能,可以让用户以动态油画转换的形式转换图片,在图片转换油画期间,用户可以随时暂停或者启动优化转换的进程;Dynamic...https://www.xiazaiba.com/html/144246.html
5.免费在线照片ai制作变油画方法工具网站ai-art.tokyo是一个免费在线照片ai制作变油画方法工具网站,使用非常简单,只需要将人像头像照片上传就可以免费在线自动ai将图片变成油画风格图片。 AI Gahaku是一个基于人工智能的绘画工具,其核心功能是将现代照片转化为古典油画风格的图像。用户只需上传一张肖像照片,系统便会自动处理并生成多种风格的艺术画作。用户可以...https://www.bgrdh.com/sites/7562.html
6.油画棒简笔画交通工具简笔画图片大全交通工具简笔画图片简笔画交通工具大全2 交通工具简笔画图片 交通工具篇简笔画 简笔画 儿童画 儿童油画棒画 马路上儿童画2幅 马路上儿童画此 各种常见交通工具简笔画 交通工具篇简笔画 各种常见交通工具简笔画 交通工具简笔画 简笔画油画棒炫彩棒水彩笔儿童画卡通画. 展开更多看...https://www.puchedu.cn/jianbihua/33eff4b34885310c.html
7.《认识工具》大班教案(通用14篇)2、介绍由来。 3、出示幼儿书法作品观赏。 4、老师示范用以上工具书写,激发幼儿书法学习的兴趣。 5、练习握毛笔。 (1)故事法:写字执笔的五个手指,就是五个用力推车上山的好兄弟,有推车的,有拉车的,还有扶住东西不往下掉的,最小的`弟弟则是在一旁鼓劲加油的,五个人分工合作缺一不可,所以要想写好字,必须要...https://www.jy135.com/jiaoan/613650.html
8.opencv实现图片油画风opencv画图工具opencv实现图片油画风 opencv画图工具 知识重点 OpenCV用的最多的色彩空间是HSV. 方便OpenCV做图像处理 img2 = img.view() # 浅拷贝 img3 = img.copy() # 深拷贝 split(mat) 分割图像的通道: b, g, r = cv2.split(img) # b, g, r 都是数组...https://blog.51cto.com/u_16099200/10551431
9.油画框画布带框画板丙烯肌理画亚麻油画框油画颜料工具套装棉麻油...油画框画布带框画板丙烯肌理画亚麻油画框油画颜料工具套装棉麻油画框大尺寸手绘油画布... 分享 收藏 降价通知 已选 15*15cm1个装,全棉细纹布框初学者,1个 送至 北京朝阳区三环到四环之间 评价 *** 商品介绍 售后保障 包装清单 商品参数 服务承诺 京东商城向您保证所售商品均为正品行货,京东自...http://item.m.jd.com/product/10099849820742.html
10.图形多媒体浏览工具GView官方版合集下载功能介绍 1.全屏幻灯浏览图片并于屏幕四角弹出图片信息与处理工具;清晰可定制的一键式图像放大镜; 2.强大的图像编辑工具:调整/重采样,旋转/翻转,裁剪,锐化/模糊,调整照明/颜色/曲线/水平等; 3.图像色彩效果:灰度,深褐色,负片,红/绿/蓝调整;图像特效:注解,阴影,凹凸贴图,素描,油画,镜头; ...https://www.duote.com/softlink/13468_2.html
11.立体贺卡的制作教案(通用15篇)各式各样的贺卡实物、示范作品、制作工具。 学生准备: 收集各种贺卡,准备彩色卡纸、剪刀、胶水、油画棒或彩色笔等。 教学过程: 1、创设情境,导入新课。 师:(播放儿童节的快乐音乐,当歌声响起时,每个人脸上都带着喜悦)同学们,六一儿童节就要到了,在这个开心的时刻里,你们想到了什么? https://www.oh100.com/shougong/1111188.html
12.幼儿园中班社会教案(通用15篇)4.在熟悉文明乘车规范的基础上,引导幼儿观察几幅乘车的情境图片,请幼儿来判断对错。 5.请幼儿进行“乘车游戏”的角色扮演,体验乘车游戏的乐趣。 活动延伸 在图书角提供各种交通工具的图书若干,组织幼儿阅读图书,并讨论乘坐摩托车、自行车、小轿车的注意事项(如坐摩托车要扶好大人坐自行车要注意把脚放好,坐小轿车要...https://www.cnfla.com/jiaoan/2660744.html
13.在线图片转油画点击选择,或将图片拖拽到此处 强度 生成 下载 重置 在线图片转油画-工具简介 在线图片转油画工具,支持将上传的照片转换为油画风格的照片。支持设置油画强度参数,转换后的油画照片支持下载到本地。在线图片转油画-使用说明 本工具支持上传 JPG, JPEG, PNG, BMP, WEBP 格式的图片,将上传的图片转换为油画风格的...https://www.lddgo.net/image/oil-paint
14.小班美术棉签画扭动的线教案(1)教师出示雪花的图片或实物让幼儿进行观察。 (2)教师讲解画。 教师:老师将这片雪花画在了纸上,小朋友猜一猜我用什么画的。今天老师给你们介绍一种新的画画工具。 教师出示棉签引起幼儿的兴趣。 (3)教师边画边讲解。 教师:小朋友用一根棉签轻轻地蘸上白颜色的水粉,在画上画一个叉,在叉的中间画一条线,形...https://mip.wenshubang.com/jiaoan/2763462.html
15.图片工具在线图片工具工具,即时工具拥有37个图片工具工具。包含了图片压缩、智能抠图、图片拼接、图片放大、图片编辑、图片水印、图片转JPG、图片分割、图片调整大小、图片转ICO、图片调色、照片转油画、GIF制作、图片Base64互转、图片无损放大、图片格式转换、图片转PNG、GIF压缩https://www.67tool.com/category/5f56fb0164935e78271fd5a1
16.大班画画公开课教案(精选18篇)1、《星月夜》图片,梵高自画像, 儿童画《星月》一幅 2、 绘画工具:油画棒,水彩笔,水粉工具, 图画纸, 3、经验准备:色彩、线条等美术方面的经验 活动过程: 一、 认识梵高 出示梵高《自画像》(附图一),并引导幼儿初步观察自画像的笔触和色彩。 教师小结:梵高生活很苦,但是热爱生活,热爱画画,画了很多作品,他的...https://m.ruiwen.com/jiaoan/4976604.html
17.开学第一课主题班会教案(精选16篇)介绍整个学期所需要的学习用品与工具 主要有: ①绘画工具:小号记号笔,油画棒、彩色铅笔、彩色蜡笔、水彩笔等彩色笔,水粉工具(水粉颜料、水粉笔、调色盘、水桶、抹布)等。 ②手工制作工具:剪刀、胶水、彩色纸等其它特殊纸品。 请学生除特殊课程要求外,选择其中绘画工具里自己比较喜欢和常用的一种工具随堂携带。 https://www.fwsir.com/jiaoan/html/jiaoan_20230206145036_2345127.html
18.神器推荐!快速将图片转换成水彩/油画风格的TopazImpression...这一次介绍的Topaz Impression这个工具、就是一个非常不错的软件。 Topaz Impression是什么? Topaz Impression这款工具,可以轻松的将你的照片处理成手绘、油画或者水彩风格的图像。购买地址:www.topazlabs.com度娘盘链接:http://pan.baidu.com 选择图像,然后稍稍按照自己的喜好调整一下参数就OK了。他也预置的很多很棒...https://www.uisdc.com/image-convert-topaz-impression/
19.美术教案《自画像》(精选9篇)1、能大胆向同伴介绍自己五官中特别的地方。 2、通过欣赏大师的自画像,尝试用绘画、粘贴等方式表现出自己五官的主要特征。 活动准备: 大师自画像图片、镜子、各色彩纸、油画棒、勾线笔 活动过程: 一、教师出示图片,引起幼儿兴趣 师:图片里是谁,你认识吗? https://m.unjs.com/jiaoan/meishu/20210707100117_3826500.html