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 相关文章推荐
用Javascript实现锚点(Anchor)间平滑跳转
Sep 08 Javascript
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
Jan 13 Javascript
js实现翻页后保持checkbox选中状态的实现方法
Nov 03 Javascript
JavaScript实现的encode64加密算法实例分析
Apr 15 Javascript
JS数字抽奖游戏实现方法
May 04 Javascript
javascript白色简洁计算器
May 04 Javascript
Javascript中For In语句用法实例
May 14 Javascript
浏览器中url存储的JavaScript实现
Jul 07 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
Nov 21 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
Apr 13 Javascript
jquery实现侧边栏左右伸缩效果的示例
Dec 19 jQuery
微信小程序如何获取用户信息
Jan 26 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 cc攻击代码与防范方法
2012/10/18 PHP
基于php-fpm的配置详解
2013/06/03 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
php解压文件代码实现php在线解压
2014/02/13 PHP
Script的加载方法小结
2011/01/12 Javascript
一个js过滤空格的小函数
2014/10/10 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
AngularJS 如何在控制台进行错误调试
2016/06/07 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
js实现图片加载淡入淡出效果
2017/04/07 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
Python面向对象特殊成员
2017/04/24 Python
Python编程之序列操作实例详解
2017/07/22 Python
Python有序查找算法之二分法实例分析
2017/12/11 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
浅析Python pandas模块输出每行中间省略号问题
2018/07/03 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
Python Collatz序列实现过程解析
2019/10/12 Python
Python如何读取文件中图片格式
2020/01/13 Python
python中的 zip函数详解及用法举例
2020/02/16 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
python eventlet绿化和patch原理
2020/11/21 Python
Css3新特性应用之视觉效果实例
2016/12/12 HTML / CSS
宝拉珍选澳大利亚官方购物网站:Paula’s Choice澳大利亚
2016/09/13 全球购物
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
拾金不昧表扬信范文
2014/01/11 职场文书
爱情检讨书大全
2014/01/21 职场文书
信息技术毕业生自荐信范文
2014/03/13 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
小学班级口号
2014/06/09 职场文书
解放思想大讨论活动心得体会
2014/09/11 职场文书
初中体育教学随笔
2015/08/15 职场文书