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 相关文章推荐
JS实现self的resend
Jul 22 Javascript
Jquery下判断Id是否存在的代码
Jan 06 Javascript
8个超棒的学习 jQuery 的网站 推荐收藏
Apr 02 Javascript
jQuery文件上传插件Uploadify使用指南
Jun 05 Javascript
Javascript 绘制 sin 曲线过程附图
Aug 21 Javascript
初识Node.js
Mar 20 Javascript
基于vue2的table分页组件实现方法
Mar 20 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
Jul 04 Javascript
浅谈ES6 模板字符串的具体使用方法
Nov 07 Javascript
Vue 实现html中根据类型显示内容
Oct 28 Javascript
浅谈Vue 函数式组件的使用技巧
Jun 16 Javascript
vue实现防抖的实例代码
Jan 11 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
php实现图片以base64显示的方法
2016/10/13 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
基于jQuery的表格操作插件
2010/04/22 Javascript
页面只能打开一次Cooike如何实现
2012/12/04 Javascript
struts2+jquery+json实现异步加载数据(自写)
2013/06/24 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
PHP守护进程实例
2015/03/06 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
2016/07/09 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
2017/03/15 Javascript
JavaScript分步实现一个出生日期的正则表达式
2018/03/22 Javascript
Django+Vue跨域环境配置详解
2018/07/06 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
2020/02/12 Javascript
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
[02:30]联想杯DOTA2完美世界全国高校联赛—北京站现场
2015/11/16 DOTA
Python实现子类调用父类的方法
2014/11/10 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
matplotlib实现区域颜色填充
2019/03/18 Python
Python自动抢红包教程详解
2019/06/11 Python
python与C、C++混编的四种方式(小结)
2019/07/15 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
vscode配置anaconda3的方法步骤
2020/08/08 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
html5 利用canvas实现超级玛丽简单动画
2013/09/06 HTML / CSS
解决canvas转base64/jpeg时透明区域变成黑色背景的方法
2016/10/23 HTML / CSS
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
Alexandre Birman美国官网:亚历山大·伯曼
2019/10/30 全球购物
学雷锋演讲稿汇总
2014/05/10 职场文书
大学生就业自荐书
2014/06/16 职场文书
董事长助理岗位职责
2015/02/11 职场文书
聘任通知书
2015/09/21 职场文书
《悬崖边的树》读后感2篇
2019/12/02 职场文书