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 encodeURI和encodeURIComponent的比较
Apr 03 Javascript
jQuery$命名冲突怎么办如何解决
Jan 16 Javascript
判断日期是否能跨月查询的js代码
Jul 25 Javascript
浅谈JavaScript实现面向对象中的类
Dec 09 Javascript
jQuery语法小结(超实用)
Dec 31 Javascript
详解Bootstrap按钮
Jan 04 Javascript
js确认框confirm()用法实例详解
Jan 07 Javascript
JS基于递归实现倒计时效果的方法
Nov 26 Javascript
vue-resource 拦截器(interceptor)的使用详解
Jul 04 Javascript
使用koa2创建web项目的方法步骤
Mar 12 Javascript
layui多图上传实现删除功能的例子
Sep 23 Javascript
微信小程序单选框自定义赋值
May 26 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
图书管理程序(三)
2006/10/09 PHP
如何开发一个虚拟域名系统
2006/10/09 PHP
PHP URL参数获取方式的四种例子
2014/02/28 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
2014/06/12 PHP
又十个超级有用的PHP代码片段
2015/09/24 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
jQuery中的常用事件总结
2009/12/27 Javascript
Javascript倒计时代码
2010/08/12 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
jQuery中的deferred对象和extend方法详解
2017/05/08 jQuery
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
JQuery实现table中tr上移下移的示例(超简单)
2018/01/08 jQuery
基于webpack.config.js 参数详解
2018/03/20 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
小程序实现投票进度条
2019/11/20 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
浅谈Python程序与C++程序的联合使用
2015/04/07 Python
Python实现的凯撒密码算法示例
2018/04/12 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
pyqt5中QThread在使用时出现重复emit的实例
2019/06/21 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
2020/04/27 Python
浅谈matplotlib中FigureCanvasXAgg的用法
2020/06/16 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
董事长秘书岗位职责
2013/11/29 职场文书
电子商务网站的创业计划书
2014/01/05 职场文书
应届生求职自荐信范文
2014/04/07 职场文书
党员创先争优活动总结
2014/05/04 职场文书
2015年酒店年度工作总结
2015/05/23 职场文书
总经理年会致辞
2015/07/29 职场文书
安全责任协议书范本
2016/03/23 职场文书