前言

上一篇文章,我们讲解了图像处理中的卷积操作和平滑(也就是模糊)处理,这篇文章我们进行亮度和对比度的变化。

其实,亮度是啥玩意?

亮度就是比较亮眼咯……

实际上对于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图像处理—亮度对比度应用案例的更多相关文章

  1. 有没有办法检查iOS中的辅助功能设置中是否启用了“增加对比度”?

    在iOS7.0.3上打开增加对比度模式会消除您通常在导航栏中看到的模糊效果,如果您使用的是α小于1.0的条形色调,这会使导航条看起来比它更透明使用默认设置.有没有办法以编程方式检查是否启用此设置?

  2. Android 如何实现亮度自动调节

    这篇文章主要介绍了Android 如何实现亮度自动调节,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下

  3. python数字图像处理之对比度与亮度调整示例

    这篇文章主要为大家介绍了python数字图像处理之对比度与亮度调整示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. Javascript图像处理—亮度对比度应用案例

    上一篇文章,我们讲解了图像处理中的卷积操作和平滑(也就是模糊)处理,这篇文章我们进行亮度和对比度的变化,有需要的朋友可以参考下

  5. Windows – 通过GPO或脚本关闭高对比度模式?

    我能够解决这个问题的唯一方法是在Windows中加载另一个“主题”.为此,我创建了一个加载默认Windows主题的登录脚本,该脚本包含以下内容:以这种方式加载主题确实在登录时重置了高色彩对比度设置,但它在每次登录时打开了一个控制面板窗口,因此我将其更改为:应用新主题后,新行终止了控制面板窗口.

  6. 调整Java中BufferedImage的亮度和对比度

    我正在使用一些框架来处理一堆图像,我所有的都是一堆BufferedImage对象.不幸的是,这些图像真的很暗,我想让它们变亮,调整对比度.就像是:有任何想法吗?解决方法实际上很简单.1.2的缩放因子和15的偏移似乎使得关于停止的图像更加明亮.好极了!

  7. 图像编辑之对比度调整(亮度对比度的算法公式) .

    总结以上是DEVMAX为你收集整理的图像编辑之对比度调整.全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  8. 图像编辑之对比度调整(亮度对比度的算法公式)

    总结以上是DEVMAX为你收集整理的图像编辑之对比度调整全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  9. 图像处理 – 在Canvas上调整亮度/对比度的公式?

    就像有一个将图像转换为灰度的公式一样,是否有一个公式可以增加图像的亮度并将其降低到相同的水平?我尝试为每个r,g和b像素添加一个值.它确实增加了亮度但是当我减少相同的值时,我没有得到原来的值.这使图像变亮.但是当我从每个像素减少100时,我没有得到原始图像.我在网上看到,有一些公式可以正确计算.有谁能解释一下?同样的对比度和伽玛?我究竟做错了什么?

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部