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 相关文章推荐
document.onreadystatechange事件的用法分析
Oct 17 Javascript
Javascript学习笔记1 数据类型
Jan 11 Javascript
JQuery插件Style定制化方法的分析与比较
May 03 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
Jan 09 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
Jul 17 Javascript
Bootstrap每天必学之下拉菜单
Nov 25 Javascript
js实现文字截断功能
Sep 14 Javascript
angular2倒计时组件使用详解
Jan 12 Javascript
JavaScript无阻塞加载和defer、async详解
Feb 26 Javascript
JavaScript 下载svg图片为png格式
Jun 21 Javascript
JavaScript实现表单注册、表单验证、运算符功能
Oct 15 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
May 17 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
PHP中的插件机制原理和实例
2014/07/08 PHP
jquery提示 &quot;object expected&quot;的解决方法
2009/12/13 Javascript
通过javascript设置css属性的代码
2009/12/28 Javascript
快速排序 php与javascript的不同之处
2011/02/22 Javascript
Jquery 切换不同图片示例代码
2013/12/05 Javascript
js实现的map方法示例代码
2014/01/13 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
jquery实现ajax提交form表单的方法总结
2014/03/03 Javascript
jquery分页插件jpaginate在IE中不兼容问题
2014/04/22 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
python实现顺序表的简单代码
2018/09/28 Python
Python字典对象实现原理详解
2019/07/01 Python
python3安装crypto出错及解决方法
2019/07/30 Python
django和vue实现数据交互的方法
2019/08/21 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
2020/06/22 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
Python 通过正则表达式快速获取电影的下载地址
2020/08/17 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
英国独特的时尚和生活方式品牌:JOY
2018/03/17 全球购物
工程监理应届生求职信
2013/11/09 职场文书
小学校园之星事迹材料
2014/05/16 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
党员对十八届四中全会的期盼思想汇报范文
2014/10/17 职场文书
海洋天堂观后感
2015/06/05 职场文书
教师节简报
2015/07/20 职场文书
祝酒词范文
2015/08/12 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书
2019秋季运动会口号
2019/06/25 职场文书
详解mysql三值逻辑与NULL
2021/05/19 MySQL
Python 如何实现文件自动去重
2021/06/02 Python
详解Python生成器和基于生成器的协程
2021/06/03 Python