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.getElementById获取控件对象为空的解决方法
Nov 20 Javascript
javascript模拟枚举的简单实例
Mar 06 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
May 12 Javascript
ES6入门教程之let和const命令详解
May 17 Javascript
深入理解Angular.JS中的Scope继承
Jun 04 Javascript
基于Bootstrap分页的实例讲解(必看篇)
Jul 04 Javascript
vue项目中v-model父子组件通信的实现详解
Dec 10 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
May 03 Javascript
VUE搭建手机商城心得和遇到的坑
Feb 21 Javascript
JavaScript中关于base64的一些事
May 06 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
Jan 08 Vue.js
JS + HTML 罗盘式时钟的实现
May 21 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 session
2013/10/28 PHP
getimagesize获取图片尺寸实例
2014/11/15 PHP
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
2014/11/19 PHP
php正则preg_replace_callback函数用法实例
2015/06/01 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
php生成动态验证码gif图片
2015/10/19 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
2017/12/31 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
JavaScript入门教程(3) js面向对象
2009/01/31 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
jQuery实现的多滑动门,多选项卡效果代码
2016/03/28 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
vue-cli+webpack记事本项目创建
2017/04/01 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
在vscode中统一vue编码风格的方法
2018/02/22 Javascript
详解组件库的webpack构建速度优化
2018/06/18 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
微信小程序后端实现授权登录
2020/02/24 Javascript
jQuery实现鼠标放置名字上显示详细内容气泡提示框效果的方法分析
2020/04/04 jQuery
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
通过python下载FTP上的文件夹的实现代码
2013/02/10 Python
用Python制作检测Linux运行信息的工具的教程
2015/04/01 Python
python初学之用户登录的实现过程(实例讲解)
2017/12/23 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
python 使用shutil复制图片的例子
2019/12/13 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
生物专业个人自荐信范文
2013/11/29 职场文书
财务会计大学生自我评价
2014/04/09 职场文书
秋天的怀念教学反思
2014/04/28 职场文书
法制宣传口号
2014/06/16 职场文书
青年文明号申报材料
2014/12/23 职场文书