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 相关文章推荐
多种方法实现load加载完成后把图片一次性显示出来
Feb 19 Javascript
javascript实现的多个层切换效果通用函数实例
Jul 06 Javascript
文字垂直滚动之javascript代码
Jul 29 Javascript
Node.js的Web模板引擎ejs的入门使用教程
Jun 06 Javascript
原生JS实现垂直手风琴效果
Feb 19 Javascript
JavaScript中创建原子的方法总结
Aug 26 Javascript
vue中组件通信的八种方式(值得收藏!)
Aug 09 Javascript
深入理解令牌认证机制(token)
Aug 22 Javascript
JS实现字体背景跑马灯
Jan 06 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
Feb 14 Javascript
vue循环中点击选中再点击取消(单选)的实现
Sep 10 Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
Sep 10 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实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
PHP批量生成缩略图的代码
2008/07/19 PHP
PHP 文件上传功能实现代码
2009/06/24 PHP
PHP GD 图像处理组件的常用函数总结
2010/04/28 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
利用Jquery队列实现根据输入数量显示的动画
2016/09/01 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
2017/02/13 Javascript
vue中如何实现变量和字符串拼接
2017/06/19 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
vuex进阶知识点巩固
2018/05/20 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
Vuex的API文档说明详解
2020/02/05 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
python 实现文件的递归拷贝实现代码
2012/08/02 Python
python3.5使用tkinter制作记事本
2016/06/20 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
Python实现Canny及Hough算法代码实例解析
2020/08/06 Python
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
Farfetch香港官网:汇集全球时尚奢侈品购物平台
2017/11/26 全球购物
英语专业应届生求职信范文
2013/11/15 职场文书
高三生物教学反思
2014/01/25 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
绿色家庭事迹材料
2014/05/01 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
学校领导班子对照检查材料
2014/08/28 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS