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之更有效率的字符串替换
Aug 02 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
Jul 30 Javascript
js this函数调用无需再次抓获id,name或标签名
Mar 03 Javascript
JS控制网页动态生成任意行列数表格的方法
Mar 09 Javascript
javascript中call和apply的用法示例分析
Apr 02 Javascript
AngularJs定制样式插入到ueditor中的问题小结
Aug 01 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
Sep 18 Javascript
基于vue实现多引擎搜索及关键字提示
Mar 16 Javascript
zTree获取当前节点的下一级子节点数实例
Sep 05 Javascript
JS实现提交表单前的数字及邮箱校检功能
Nov 13 Javascript
小程序实现简单语音聊天的示例代码
Jul 24 Javascript
Node.js web 应用如何封装到Docker容器中
Sep 01 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加密解密的代码
2006/10/09 PHP
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
PHP中error_reporting()用法详解
2015/08/31 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
js鼠标左右键 键盘值小结
2010/06/11 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
2014/08/06 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
通过示例彻底搞懂js闭包
2017/08/10 Javascript
javaScript日期工具类DateUtils详解
2017/12/08 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
深入理解webpack process.env.NODE_ENV配置
2020/02/23 Javascript
js实现随机圆与矩形功能
2020/10/29 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
python字符串连接方法分析
2016/04/12 Python
python3中类的继承以及self和super的区别详解
2019/06/26 Python
python 实现按对象传值
2019/12/26 Python
python如何求100以内的素数
2020/05/27 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
美国二手复古奢侈品包包购物网站:LXRandCo
2019/06/18 全球购物
服装创业计划书范文
2014/02/05 职场文书
拓展策划方案
2014/06/03 职场文书
2016新年慰问信范文
2015/03/25 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
起诉书格式范文
2015/05/20 职场文书
深入探讨opencv图像矫正算法实战
2021/05/21 Python
python实现A*寻路算法
2021/06/13 Python
vue数据字典取键值项目的字典问题
2022/04/12 Vue.js
ipad隐藏软件app图标方法
2022/04/19 数码科技
python中filter,map,reduce的作用
2022/06/10 Python