图像滤镜艺术---图像滤镜晕影调节算法研究
本文对滤镜中常见的晕影,晕角效果的实现做了研究,具体如下:
1 晕影调整算法
所谓晕影就是给图像四个角添加暗影效果,这暗影向图像中心逐渐淡化。我们使用如下公式来实现:
假设图像宽度高度分别为w,h:
double d = Math.Sqrt((i - w / 2) * (i - w / 2) + (j - h / 2) * (j - h / 2));
double dmax = 1.0 / Math.Sqrt(w * w / 4 + h * h / 4);
double lum = 0.75 / (1.0 + Math.Exp((d * dmax - cRadius) * cGradient)) + cLight;
//eg:double lum = 0.75 / (1.0 + Math.Exp((d * dmax - 0.85) * 5)) + 0.35;
r = (int)((double)r * lum);
g = (int)((double)g * lum);
b = (int)((double)b * lum);
注释:
cRadius (cRadius=0.73)这个参数控制晕影的半径,值越大,半径越大;
cLight (cLight=0.25)控制中心圆形区域内的像素亮度,值越大,图像越亮;
cGradient (cGradient=20)这个参数控制中心区域与晕影过渡部分的梯度,值越小,过渡越自然,越不明显;
上述算法实现的是圆形晕影。
有了晕影图像之后,我们采用K比例混合算法来实现晕影强度的可调性,假设晕影图像为S(n,m),原图为X(n,m),效果图为Y(n,m),晕影强度因子为K,K属于[0,1],混合公式如下:
Y(n,m)=K*X(n,m)+(1-K)*S(n,m)
这样就实现了晕影效果从无到有的调节过程。
2 晕影调节快速算法
晕影调节的快速算法主要是改进晕影图像的生成过程。我们可以按照自己的需求使用PS制作出一张晕影效果图,来代替算法生成晕影图像的过程,这样就可以节省算法生成的时间了,之后的调节过程不变。
当然,这个算法的缺点就是晕影的半径,过渡程度和亮度无法调整。
目前,这里给出Instagram里使用的晕角模板:
在Instagram中,是使用这个模板与目标图像执行“柔光”混合图层算法,得到晕角效果的,然后使用1中的K比例混合算法,来快速调节。
最后给出android 中C代码,可以直接使用。
附录 Android C Code with RGB565
void THaloEffect(int* srcData, int width, int height) {
int gray = 0, green = 0, blue = 0, red = 0, i = 0, j = 0, alpha = 0xFF << 24;
for(j = 0; j < height; j++)
{
for(i = 0; i < width; i++)
{
gray = srcData[i + j * width];
red = ((gray >> 16) & 0xFF);
green = ((gray >> 8) & 0xFF);
blue = (gray & 0xFF);
double d = sqrt((i - width / 2) * (i - width / 2) + (j - height / 2) * (j - height / 2));
double dmax = 1.0 / sqrt(width * width / 4 + height * height / 4);
//double lum = 0.75 / (1.0 + Math.Exp((d * dmax - 0.73) * 20)) + 0.25;
double lum = 0.75 / (1.0 + exp((d * dmax - 0.73) * 20)) + 0.25;
red = (int)((double)red * lum);
red = CheckRange(red);
green = (int)((double)green * lum);
green = CheckRange(green);
blue = (int)((double)blue * lum);
blue = CheckRange(blue);
srcData[i + j * width] = alpha | (red << 16) | (green << 8) | blue;
}
}
};
void THaloEffect_F(int* srcData, int* mask, int width, int height, int ratio)
{
int gray = 0,green = 0,blue = 0,red = 0,i = 0, mRed = 0, mGreen = 0, mBlue = 0, alpha = 0xFF << 24;
int length = width * height;
for (i = 0; i < length; i++) {
gray = srcData[i];
red = ((gray >> 16) & 0xFF);
green = ((gray >> 8) & 0xFF);
blue = (gray & 0xFF);
gray = mask[i];
mRed = ((gray >> 16) & 0xFF);
mGreen = ((gray >> 8) & 0xFF);
mBlue = (gray & 0xFF);
mRed = ModeSmoothLight(red, mRed);
mGreen = ModeSmoothLight(green, mGreen);
mBlue = ModeSmoothLight(blue, mBlue);
red = (mRed * ratio + (100 - ratio) * red) / 100;
green = (mGreen * ratio + (100 - ratio) * green) / 100;
blue = (mBlue * ratio + (100 - ratio) * blue) / 100;
srcData[i] = alpha | (red << 16) | (green << 8) | blue;
}
};
图像滤镜艺术---图像滤镜晕影调节算法研究相关推荐
- 图像滤镜艺术---漫画滤镜
图像滤镜艺术---漫画滤镜 原文: 图像滤镜艺术---漫画滤镜 漫画滤镜 所谓漫画滤镜就是通过复杂的算法来模拟漫画的特点,从而使真实照片呈现出漫画的风格.要实现漫画的效果,首先要了解漫画的特点,漫画具 ...
- 图像滤镜艺术---Wave滤镜
图像滤镜艺术---Wave滤镜 原文:图像滤镜艺术---Wave滤镜 Wave Filter水波滤镜 水波滤镜是通过坐标变换来模拟水波效果,使图像呈现出水波的特效.这个滤镜有一个可调参数:水波的扭曲程 ...
- 图像和视频的快速去雾算法研究
王昕, 孙莹莹, 李影昉. 图像和视频的快速去雾算法研究[J]. 影像科学与光化学, 2016, 34(1): 82-87. WANG Xin, SUN Yingying, LI Yingfang ...
- 图像滤镜艺术---水彩画滤镜
水彩画滤镜 水彩画滤镜算法如下: 1,假设原始图像为F(x,y),灰度化得到G(x,y): 2,构建一个半径为Radius的正方形模板M,边长为2*Radius+1: 3,将M在F上依次遍历每个像素, ...
- 图像滤镜艺术---图像光照效果滤镜
图像光照滤镜 图像光照提滤镜主要是模拟阳光照射下的图像效果,通常使用在暗光环境下拍摄的照片中,或者是没有太阳的日景照片中.可调参数主要包括光源位置,光照半径和光照强度,通过调整这些参数,来达到我们想要 ...
- 用php照片艺术化,图像滤镜艺术--大雪滤镜
今天给大家介绍一款大雪滤镜,可以使你夏天的照片瞬间幻化为大雪纷飞的场景哦!先看下效果图: 上面三张图像分别是(a)原始图像,(b)PS效果图,(c)C#代码效果图 这个大雪滤镜也比较简单,按照之前的步 ...
- 程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦
程序员面试.算法研究.编程艺术.红黑树.数据挖掘5大经典原创系列集锦与总结 (编程艺术github:https://github.com/julycoding/The-Art-Of-Programmi ...
- 图像滤镜艺术---(Lightleaks Filter)漏光滤镜
原文:图像滤镜艺术---(Lightleaks Filter)漏光滤镜 (Lightleaks Filter)漏光滤镜 漏光拍摄其实就是一种摄影手法,最初是因为强烈光照导致相片交卷的过分曝光,最终在成 ...
- 图像滤镜艺术---(Nostalgla Filter)老照片滤镜
原文:图像滤镜艺术---(Nostalgla Filter)老照片滤镜 (Nostalgla Filter)老照片滤镜 Nostalgla Filter主要是通过算法来模拟一种复古,陈旧的照片风格,以 ...
最新文章
- Head First设计模式之目录
- 一起学习阿里巴巴数据中台实践!首次公开!
- 函数计算自动化运维实战2 -- 事件触发 eip 自动转移
- html div p 区别,html中div br p三者有什么区别?
- linux怎么把磁盘的东西拷贝,[Linux]如何拷贝已有数据磁盘,并将新的磁盘挂接到其他虚机上...
- redis desktop manager_面试官:Redis分布式锁如何解决锁超时问题?
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 85
- 【CentOS 7笔记11】,目录权限,所有者与所有组,隐藏权限#171022
- 苹果电脑mac_清理Mac苹果电脑DNS缓存
- 增改删(python 版)
- 单例设计模式 序列化破坏单例模式原理解析及解决方案?
- [Java 基础]控制语句
- python免费程序-Python——免费观看全网视频小程序
- 计算机excel在三维饼图改字,Excel如何一键生成饼图 Excel如何修改饼图
- 6. 利用word的替换功能可以完成很多工作——word高级替换技巧
- 景深决定照相机什么特性_2018年自考《摄影基础》复习试题及答案
- 域名会到期吗?到期的域名会怎么处理呢?
- 表白php制作教程视频,制作表白视频的软件 怎么制作出好看的表白小视频
- 项目管理从需求管理开始--不懂需求管理还敢带项目?
- 两台笔记本如何通过网线实现拓展屏
热门文章
- jquery mysql jsp搜索功能_实现搜索框自动提示功能(jquery+php)
- 处理表格数据时,去除表头两种写法,jquery 删除表头之外的数据
- 判断某值是否属于枚举类中的值_编写高质量可维护的代码之优化逻辑判断
- android lcd工具,Android东西lcd配置
- 利用OpenCV读取和写入视频
- Paddle 环境中 使用LeNet在MNIST数据集实现图像分类
- 霍尔开关YS1382检测速度 以及对 智能车竞赛节能组的影响
- 第十六届全国大学智能汽车竞赛全向组沁恒芯片申请统计情况
- 2021年春季学期-信号与系统-第十次作业参考答案-第二小题
- 2021年春季学期-信号与系统-第一次作业参考答案-第五题