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 replace方法与正则表达式
Feb 19 Javascript
用JavaScript调用WebService的示例
Apr 07 Javascript
js 动态选中下拉框
Nov 26 Javascript
Js如何判断客户端是PC还是手持设备简单分析
Nov 22 Javascript
JQuery仿小米手机抢购页面倒计时效果
Dec 16 Javascript
jquery图片切换实例分析
Apr 15 Javascript
jquery实现清新实用的网页菜单效果
Aug 28 Javascript
使用JQuery在线制作ppt并在线演示源码特效
Sep 08 Javascript
javascript鼠标右键菜单自定义效果
Dec 08 Javascript
jQuery获取浏览器类型和版本号的方法
Jul 05 Javascript
jQuery中each遍历的三种方法实例分析
Sep 07 jQuery
JQuery发送ajax请求时中文乱码问题解决
Nov 14 jQuery
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中用于检测一个地理IP地址是否可用的代码
2012/02/19 PHP
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
2012/03/26 PHP
php实现的验证码文件类实例
2015/06/18 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
JS获取IUSR_机器名和IWAM_机器名帐号的密码
2006/12/06 Javascript
javascript 表单的友好用户体现
2009/01/07 Javascript
Jquery中dialog属性小记
2010/09/03 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
JavaScript中的parse()方法使用简介
2015/06/12 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
javascript常用函数(2)
2015/11/05 Javascript
基于javascript实现简单计算器功能
2016/01/03 Javascript
Node.js实现数据推送
2016/04/14 Javascript
jQuery unbind 删除绑定事件详解
2016/05/24 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
DOM中事件处理概览与原理的全面解析
2016/08/16 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
2017/08/08 Javascript
Vue.js标签页组件使用方法详解
2019/10/19 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
js实现拖拽元素选择和删除
2020/08/25 Javascript
Python函数式编程指南(三):迭代器详解
2015/06/24 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
Python检查图片是否损坏及图片类型是否正确过程详解
2019/09/30 Python
python with (as)语句实例详解
2020/02/04 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
GAP欧盟网上商店:GAP EU
2016/09/13 全球购物
知识竞赛拉拉队口号
2014/06/16 职场文书
市场策划求职信
2014/08/07 职场文书
上课随便讲话检讨书
2014/09/12 职场文书
Python Parser的用法
2021/05/12 Python
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP
python实现学员管理系统(面向对象版)
2022/06/05 Python