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 相关文章推荐
web页面数据展示新想法(json)
Jun 08 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
May 22 Javascript
javascript实现页面刷新时自动清空表单并选中的方法
Jul 18 Javascript
jquery动画效果学习笔记(8种效果)
Nov 13 Javascript
angularjs自定义ng-model标签的属性
Jan 21 Javascript
原生js仿jquery实现对Ajax的封装
Oct 04 Javascript
JavaScript中String对象的方法介绍
Jan 04 Javascript
JavaScript监听手机物理返回键的两种解决方法
Aug 14 Javascript
vue中引用swiper轮播插件的教程详解
Aug 16 Javascript
vue.js的状态管理vuex中store的使用详解
Nov 08 Javascript
vscode调试node.js的实现方法
Mar 22 Javascript
vue实现简单的登录弹出框
Oct 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
PHP 常见郁闷问题答解
2006/11/25 PHP
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
windows中为php安装mongodb与memcache
2015/01/06 PHP
PHP连接操作access数据库实例
2015/03/30 PHP
Composer设置忽略版本匹配的方法
2016/04/27 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
Bookmarklet实现启动jQuery(模仿 云输入法)
2010/09/15 Javascript
js 本地预览的简单实现方法
2014/02/18 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
JS组件Bootstrap实现图片轮播效果
2016/05/16 Javascript
jquery表单插件form使用方法详解
2017/01/20 Javascript
canvas实现刮刮卡效果
2017/03/14 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
2017/12/01 Javascript
JavaScript实现左侧菜单效果
2017/12/14 Javascript
Vue 莹石摄像头直播视频实例代码
2018/08/31 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
微信小程序在地图选择地址并返回经纬度简单示例
2018/12/03 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
python3+selenium自动化测试框架详解
2019/03/17 Python
利用Python检测URL状态
2019/07/31 Python
Python面向对象之继承原理与用法案例分析
2019/12/31 Python
解决Python图形界面中设置尺寸的问题
2020/03/05 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
Python实现JS解密并爬取某音漫客网站
2020/10/23 Python
Python descriptor(描述符)的实现
2020/11/15 Python
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
经典c++面试题五
2014/12/17 面试题
优秀研究生自我鉴定
2013/12/04 职场文书
简历自我评价怎么写好呢?
2014/01/04 职场文书
自我鉴定注意事项
2014/01/19 职场文书
感恩教育活动总结
2014/05/05 职场文书
PHP 技巧 * SVG 保存为图片(分享图生成)
2021/04/02 PHP