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对象是否可用的最正确方法分析
Oct 03 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
May 09 Javascript
谈一谈javascript中继承的多种方式
Feb 19 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
Feb 20 Javascript
jQuery中table数据的值拷贝和拆分
Mar 19 Javascript
Vue.js中extend选项和delimiters选项的比较
Jul 17 Javascript
vue的diff算法知识点总结
Mar 29 Javascript
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
Feb 14 jQuery
layui点击弹框页面 表单请求的方法
Sep 21 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
Mar 04 Javascript
一行JavaScript代码如何实现瀑布流布局
Dec 11 Javascript
基于vue的video播放器的实现示例
Feb 19 Vue.js
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
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
PHP中数组转换为SimpleXML教程
2019/01/27 PHP
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
如何用javascript计算文本框还能输入多少个字符
2015/07/29 Javascript
javascript中SetInterval与setTimeout的定时器用法
2015/08/24 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
Bootstrap Table使用心得总结
2016/11/29 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
Angular.JS中的指令引用template与指令当做属性详解
2017/03/30 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
把vue-router和express项目部署到服务器的方法
2018/02/21 Javascript
微信小程序画布圆形进度条显示效果
2020/11/17 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
vue接通后端api以及部署到服务器操作
2020/08/13 Javascript
在Python中使用判断语句和循环的教程
2015/04/25 Python
利用Python中unittest实现简单的单元测试实例详解
2017/01/09 Python
python机器学习理论与实战(四)逻辑回归
2018/01/19 Python
TensorFlow如何实现反向传播
2018/02/06 Python
使用python Telnet远程登录执行程序的方法
2019/01/26 Python
Python初学者常见错误详解
2019/07/02 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
致垒球运动员加油稿
2014/02/16 职场文书
2015年维修工作总结
2015/04/25 职场文书
红高粱观后感
2015/06/10 职场文书
利用Python判断你的密码难度等级
2021/06/02 Python
使用goaccess分析nginx日志的详细方法
2021/07/09 Servers
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
MySQL三种方式实现递归查询
2022/04/18 MySQL
解决Mysql报错 Table 'mysql.user' doesn't exist
2022/05/06 MySQL