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.body和document.documentElement想到的
Apr 13 Javascript
Javascript 面试题随笔
Mar 31 Javascript
js操作CheckBoxList实现全选/反选(在客服端完成)
Feb 02 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
Jun 26 Javascript
jquery判断RadioButtonList和RadioButton中是否有选中项示例
Sep 29 Javascript
解析Javascript小括号“()”的多义性
Dec 03 Javascript
前台js对象在后台转化java对象的问题探讨
Dec 20 Javascript
了不起的node.js读书笔记之例程分析
Dec 22 Javascript
调试JavaScript中正则表达式中遇到的问题
Jan 27 Javascript
js 取消页面可以选中文字的功能方法
Jan 02 Javascript
JS如何生成随机验证码
Mar 02 Javascript
flexible.js实现移动端rem适配方案
Apr 07 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实例分享之mysql数据备份
2014/05/19 PHP
php实现RSA加密类实例
2015/03/26 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
php 猴子摘桃的算法
2017/06/20 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
jquery ajax 调用失败的原因示例介绍
2013/09/27 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
js获取url传值的方法
2015/12/18 Javascript
Vue.js 和 MVVM 的注意事项
2016/11/07 Javascript
老生常谈js中的MVC
2017/07/25 Javascript
解决vue页面DOM操作不生效的问题
2018/03/17 Javascript
element ui分页多选,翻页记忆的实例
2019/09/03 Javascript
js实现简单的秒表
2020/01/16 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
微信小程序入门之指南针
2020/10/22 Javascript
[00:10]DOTA2全国高校联赛 以DOTA2会友
2018/05/30 DOTA
python迭代器的使用方法实例
2013/11/21 Python
python中精确输出JSON浮点数的方法
2014/04/18 Python
python实现识别相似图片小结
2016/02/22 Python
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
2018/12/28 Python
python 堆和优先队列的使用详解
2019/03/05 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
《大海那边》教学反思
2014/04/09 职场文书
2014年销售助理工作总结
2014/12/01 职场文书
投标邀请书范本
2015/02/02 职场文书
2015年统战工作总结
2015/05/19 职场文书
酒会开场白大全
2015/06/01 职场文书
公司老总年会致辞
2015/07/30 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书