Javascript图像处理—亮度对比度应用案例


Posted in Javascript onJanuary 03, 2013

前言

上一篇文章,我们讲解了图像处理中的卷积操作和平滑(也就是模糊)处理,这篇文章我们进行亮度和对比度的变化。

其实,亮度是啥玩意?

亮度就是比较亮眼咯……

Javascript图像处理—亮度对比度应用案例

实际上对于RGBA颜色空间,变亮其实就等于R、G、B三个通道同时加大,那么变暗就等于同时减小咯。

这比较好理解,因为最暗的黑色是RGB(0,0,0),而最亮的白色是RGB(255,255,255)。所以变亮应该RGB各通道都要增大。

那么,对比度呢?

对比度,其实就是颜色差啦。

那么对于RGBA颜色空间,对比度变大其实就等于R、G、B三个通道同时乘以一个比例,因为这样相近的颜色之间的差距就变大了,那么减小就是同时除以咯。

举个例子,原来RGB(23,44,55)和RGB(33,44,55)相差只有10,但是一起乘以2以后,就变成了RGB(46,88,110)和RGB(66,88,110)

,相差变成了20了,也就是“颜色差”变大了。

线性模型

newRGB =  Contrast * RGB + Brightness

线性模型满足上述公式,其中 Contrast表示对比度系数,Brightness表示亮度系数。

线性模型实现比较简单,但是很容易就调出全白或者全黑的图片,对于普通用户来说ContrastBrightness选多少比较好也比较难确定。

所以,实际上在Photoshop里面使用的并不是线性模型,而是非线性模型。

非线性模型

非线性模型中对比度增大和阈值Threshold有关:

Contrast >= 0时:

newRGB = RGB + (RGB - Threshold) * (1 / (1 - Contrast / 255) - 1)

Contrast < 0时:

newRGB = RGB + (RGB - Threshold) * Contrast / 255

那么当对比度和亮度同时调整时候呢?

如果对比度大于0,先调整亮度,再调整对比度;当对比度小于0时,则相反,先调整对比度,再调整亮度。

最后一个问题,阈值Threshold到底是什么,其实这个是图片的灰度平均值。

实现代码

var brightnessContrast = function(__src, __brightness, __contrast){ 
__src || error(arguments.callee, IS_UNDEFINED_OR_NULL/* {line} */); 
if(__src.type === "CV_RGBA"){ 
var sData = __src.data, 
width = __src.col, 
height = __src.row, 
dst = new Mat(height, width, CV_RGBA), 
dData = dst.data, 
brightness = Math.max(-255, Math.min(255, __brightness || 0)), 
contrast = Math.max(-255, Math.min(255, __contrast || 0)); var gray = cvtColor(__src, CV_RGBA2GRAY), 
allValue = 0, 
gData = gray.data; 
var y, x, c; 
for(y = height; y--;){ 
for(x = width; x--;){ 
allValue += gData[y * width + x]; 
} 
} 
var r, g, b, offset, gAverage = (allValue / (height * width)) | 0; 
for(y = height; y--;){ 
for(x = width; x--;){ 
offset = (y * width + x) * 4; 
dData[offset] = sData[offset] + brightness; 
dData[offset + 1] = sData[offset + 1] + brightness; 
dData[offset + 2] = sData[offset + 2] + brightness; 
if(contrast >= 0){ 
for(c = 3; c--;){ 
if(dData[offset + c] >= gAverage){ 
dData[offset + c] = dData[offset + c] + (255 - gAverage) * contrast / 255; 
}else{ 
dData[offset + c] = dData[offset + c] - (gAverage * contrast / 255); 
} 
} 
}else{ 
dData[offset] = dData[offset] + (dData[offset] - gAverage) * contrast / 255; 
dData[offset + 1] = dData[offset + 1] + (dData[offset + 1] - gAverage) * contrast / 255; 
dData[offset + 2] = dData[offset + 2] + (dData[offset + 2] - gAverage) * contrast / 255; 
} 
dData[offset + 3] = 255; 
} 
} 
}else{ 
error(arguments.callee, UNSPPORT_DATA_TYPE/* {line} */); 
} 
return dst; 
};

效果

Javascript图像处理—亮度对比度应用案例

Javascript 相关文章推荐
详解new function(){}和function(){}() 区别分析
Mar 22 Javascript
测试JavaScript字符串处理性能的代码
Dec 07 Javascript
js实现简单登录功能的实例代码
Nov 09 Javascript
JavaScript实现多个重叠层点击切换效果的方法
Apr 24 Javascript
js中window.open的参数及注意注意事项
Jul 06 Javascript
AngularJs bootstrap搭载前台框架——基础页面
Sep 01 Javascript
详解Angular 4.x NgTemplateOutlet
May 24 Javascript
深入理解 webpack 文件打包机制(小结)
Jan 08 Javascript
如何更好的编写js async函数
May 13 Javascript
js异步上传多张图片插件的使用方法
Oct 22 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
Jan 20 Javascript
vue axios封装及API统一管理的方法
Apr 18 Javascript
javascript学习(二)javascript常见问题总结
Jan 02 #Javascript
javascript学习(一)构建自己的JS库
Jan 02 #Javascript
jQuery常见开发技巧详细整理
Jan 02 #Javascript
js显示时间 js显示最后修改时间
Jan 02 #Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
Jan 02 #Javascript
js 回车提交表单两种实现方法
Dec 31 #Javascript
event.currentTarget与event.target的区别介绍
Dec 31 #Javascript
You might like
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
php简单日历函数
2015/10/28 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
jQuery.holdReady()方法用法实例
2014/12/27 Javascript
浅谈javascript中自定义模版
2015/01/29 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
js实现简单折叠、展开菜单的方法
2015/08/28 Javascript
学习JavaScript正则表达式
2015/11/13 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
JQuery ZTree使用方法详解
2017/01/07 Javascript
BootStrap注意事项小结(五)表单
2017/03/10 Javascript
jQuery子选择器与可见性选择器实例分析
2019/06/28 jQuery
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
vue实现列表拖拽排序的功能
2020/11/02 Javascript
使用python实现省市三级菜单效果
2016/01/20 Python
利用Python找出序列中出现最多的元素示例代码
2017/12/08 Python
python中闭包Closure函数作为返回值的方法示例
2017/12/17 Python
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
详解django.contirb.auth-认证
2018/07/16 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
美国高街时尚品牌:OASAP
2016/07/24 全球购物
蔻驰意大利官网:COACH意大利
2019/01/16 全球购物
Vans澳大利亚官网:购买鞋子、服装及配件
2019/09/05 全球购物
应届毕业生的个人自我鉴定
2013/10/24 职场文书
保护环境倡议书300字
2014/05/19 职场文书
个人委托书怎么写
2014/09/17 职场文书
世界水日宣传活动总结
2015/02/09 职场文书
2015年小学二年级班主任工作总结
2015/05/21 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
基于Python实现流星雨效果的绘制
2022/03/18 Python
Python列表的索引与切片
2022/04/07 Python
JAVA长虹键法之建造者Builder模式实现
2022/04/10 Java/Android
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL