文档章节

调整图像- 自动对比度、自动色阶算法

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:38
字数 1338
阅读 5
收藏 0
点赞 0
评论 0

  我们以24位彩色图像为例说明这两个算法。

  在执行两个算法之前,我们需要确定两个参数,大家在用PS时选择自动色阶并不会弹出什么参数设置对话框,那是因为PS把这个隐藏的比较深 。选择曲线或色阶命令,然后在弹出的界面中点击选项按钮,会出现如下界面:

   

  注意其中的裁剪(C)/裁剪(P)中的变量,这两个参数是影响自动色阶效果的重要数据,我们以变量LowCut和HighCut来记录它。

     好,接着说。两个算法的第一步,都是分别统计各通道(红/绿/蓝)的直方图。

 1      Dim HistRed( 255)         As  Long, HistGreen( 255)         As  Long
 2      Dim HistBlue( 255)        As  Long
 3      For Y =  0  To Height -  1
 4         Speed = Y * Stride
 5          For X =  0  To Width -  1
 6             Red = ImageData(Speed +  2): Green = ImageData(Speed +  1): Blue = ImageData(Speed)
 7             HistRed(Red) = HistRed(Red) +  1                  ' 统计直方图
 8             HistGreen(Green) = HistGreen(Green) +  1
 9             HistBlue(Blue) = HistBlue(Blue) +  1
10             Speed = Speed +  3
11          Next
12      Next

      看了上面代码,我很欣赏C++的++运算符,HistRed(Red)++,多么简单啊,而且更高效。

      算法的第二步,分别计算各通道按照给定的参数所确定的上下限值。什么意思呢,比如对于蓝色通道,我们从色阶0开始向上累加统计直方图,当累加值大于LowCut*所有像素数时,以此时的色阶值计为MinBlue。然后从色阶255开始向下累计直方图,如果累加值大于HighCut*所有像素时,以此时的色阶值计为MaxBlue。

 1     PixelAmount = Width * Height                     ' 所有像素的数目
 2     Sum =  0
 3      For Y =  0  To  255
 4         Sum = Sum + HistBlue(Y)
 5          If Sum >= PixelAmount * LowCut *  0.01  Then    ' 注意PS界面里的那个百分号
 6             MinBlue = Y                              ' 得到蓝色分量的下限
 7              Exit  For                                 ' 退出循环
 8          End  If
 9      Next
10     
11     Sum =  0
12      For Y =  255  To  0  Step - 1
13         Sum = Sum + HistBlue(Y)
14          If Sum >= PixelAmount * HighCut *  0.01  Then   ' 注意PS界面里的那个百分号
15             MaxBlue = Y                              ' 得到蓝色分量的上限
16              Exit  For                                 ' 退出循环
17          End  If
18      Next

      绿色通道和红色通道的代码类似,请朋友们自己补充。

      下一步,自动色阶和自动对比度就有所区别了,我们首先介绍自动色阶。

      自动色阶:按照我们刚刚计算出的MinBlue/MaxBlue构建一个隐射表,隐射表的规则是,对于小于MinBlue的值,则隐射为0(实际上这句话也不对,隐射为多少是和那个自动颜色校正选项对话框中的阴影所设定的颜色有关,默认情况下是黑色,对应的RGB分量都为0,所以我们这里就隐射为0,有兴趣你们也可以指定为其他的参数),对于大于MaxBlue的值,则隐射为255(同理,这个值和高光的颜色设置有关),对于介于MinBlue和MaxBlue之间的值,则进行线性隐射,默认是隐射为0到255之间(当然实际是和我们的暗调和高光的设置有关,并且这里其实也不是线性隐射,是有一个Gamma校正,为了简便,用线性替代效果也没太大的问题)。

1      For Y =  0  To  255
2          If Y <= MinBlue  Then
3             BlueMap(Y) =  0
4          ElseIf Y >= MaxBlue  Then
5             BlueMap(Y) =  255
6          Else
7             BlueMap(Y) = (Y - MinBlue) / (MaxBlue - MinBlue) *  255       ' 线性隐射
8          End  If
9      Next

      顺便提一点,从程序的鲁棒性上来说,在执行这段代码前判断下MaxBlue是否等于MinBlue很有必要,两者相等,这图就无需校正了,直接结束程序。

      用同样的道理,计算出绿色和红色通道的隐射表GreenMap和RedMap。

      最后一步,对各通道图像数据进行隐射。

1      For Y =  0  To Height -  1
2         Speed = Y * Stride
3          For X =  0  To Width -  1
4             ImageData(Speed) = BlueMap(ImageData(Speed))
5             ImageData(Speed +  1) = GreenMap(ImageData(Speed +  1))
6             ImageData(Speed +  2) = RedMap(ImageData(Speed +  2))
7             Speed = Speed +  3
8          Next
9      Next

       自动色阶完成,下面我们谈谈自动对比度的不同。

       在计算完各通道对应的上下限值后,自动对比度算法首先获取三个通道下限值的最小值,以及上限值的最大值,如下代码:

 1      If MinBlue < MinGreen  Then
 2         Min = MinBlue
 3      Else
 4         Min = MinGreen
 5      End  If
 6      If Min > MinRed  Then Min = MinRed
 7     
 8      If MaxBlue > MaxGreen  Then
 9         Max = MaxBlue
10      Else
11         Max = MaxGreen
12      End  If
13      If Max < MaxRed  Then Max = MaxRed

   然后以此为新的上下限,计算隐射表。

1      For Y =  0  To  255
2          If Y <= Min  Then
3             Map(Y) =  0
4          ElseIf Y > Max  Then
5             Map(Y) =  255
6          Else
7             Map(Y) = (Y - Min) / (Max - Min) *  255       ' 线性隐射
8          End  If
9      Next

      最后,以这个隐射表分别对红绿蓝通道进行处理。

1      For Y =  0  To Height -  1
2         Speed = Y * Stride
3          For X =  0  To Width -  1
4             ImageData(Speed) = Map(ImageData(Speed))
5             ImageData(Speed +  1) = Map(ImageData(Speed +  1))
6             ImageData(Speed +  2) = Map(ImageData(Speed +  2))
7             Speed = Speed +  3
8          Next
9      Next

   由以上过程可以看出,对于灰度图像,由于只有一个通道,自动对比度和自动色阶实际上算法相同,结果一样。

       对于32位图像,这类单点像素处理的过程一般是无需处理Alpha通道的。

 

本文转载自:http://www.cnblogs.com/Imageshop/archive/2011/11/13/2247614.html

共有 人打赏支持
abcijkxyz
粉丝 61
博文 6195
码字总数 1876
作品 0
深圳
项目经理
OCR文字识别软件的图像编辑器功能如何用

日常工作中,有时可能需要对图像进行编辑,可是正常情况下大家都知道图像是不能直接编辑的,需要借助工具。ABBYY FineReader 12 OCR文字识别软件可以实现图像的手动编辑,接下来就具体给大家...

ABBYY ⋅ 2016/11/23 ⋅ 0

第八课:通道抠图2(人物头发)

人物头发 使用通道抠取人物图——主要是头发 结合,与! 1. 案例1: 通道+色阶 找一个对比度比较强的通道 (蓝色通道:头发比较黑,背景比较白) 复制蓝色通道 使用图像--->调整---》色阶命令...

金于虎 ⋅ 2016/10/27 ⋅ 0

Camera 图像处理原理分析

色彩篇(一) 1 前言 做为拍照手机的核心模块之一,camera sensor效果的调整,涉及到众多的参数,如果对基本的光学原理及sensor软/硬件对图像处理的原理能有深入的理解和把握的话,对我们的工...

Jerikc ⋅ 2013/09/25 ⋅ 1

图像的自动对比度调整算法

用自动对比调整算法来调整图像的对比度,请问一下图像的自动对比调整算法的原理是什么?求大神指点!

秋风若影 ⋅ 2015/12/22 ⋅ 0

第八课:通道抠图1(毛绒玩具)

引子:通道抠图法和蒙版抠图法 其他抠图工具用来扣头发和毛绒玩具不好用呢,就只有用通道抠图或者蒙版抠图了 淘宝开店过程中,很多衣服的模特图都是带有头发的 1. 通道:什么是通道 从基本功...

金于虎 ⋅ 2016/10/25 ⋅ 0

景不美,P 图软件补,自动修图系统背后的技术原理是什么?

研究人员们将推出一个能够按照专业摄影师的风格进行自动修图的新系统,分分钟拍大片。 如果你是个不会拍照的男孩子,恰好你的女友又是个喜欢拍照的姑娘,那么你之后的拍照水平可能会被疯狂吐...

图普科技 ⋅ 2017/08/09 ⋅ 0

Fotoxx 13.08 发布,Linux 照片管理软件

Fotoxx 13.08 的白平衡增加了直接的色温调整功能,图像的搜索可在前一个搜索结果集中进一步搜索,一个新的模糊函数可以模糊像素的对比度成反比,Sketch 增加第二种算法可更好处理图像,修复了...

oschina ⋅ 2013/08/04 ⋅ 1

gThumb 3.1.2 发布,支持 WebP 图像

gThumb 3.1.2 发布了,该版本最值得关注的就是增加对 WebP 图像格式的支持;另外该版本可保存和恢复窗口最大化状态、过滤条状态、视频查看器音量、已访问地址历史和查看器边栏状态;不再使用...

oschina ⋅ 2012/11/04 ⋅ 0

基于HALCON的模板匹配方法总结

转自:http://m.blog.csdn.net/blog/u012913847/35549923 很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间。去年有过一段时间的集中学习,做了许多的练习和实验,...

weixin_37371316 ⋅ 02/04 ⋅ 0

c#开发大全、系列文章、精品教程

全栈工程师开发手册 (作者:栾鹏) c#系列教程: c#实现ajax通信:向后台发送JSON字符串,接收响应字符串,并转换为对象 c#文件夹常用操作,属性设置,遍历、压缩 c#获取网页源代码的5种方式...

luanpeng825485697 ⋅ 2017/10/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 30分钟前 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

vim编辑模式、vim命令模式、vim实践

vim编辑模式 编辑模式用来输入或修改文本内容,编辑模式除了Esc外其他键几乎都是输入 如何进入编辑模式 一般模式输入以下按键,均可进入编辑模式,左下角提示 insert(中文为插入) 字样 i ...

蛋黄Yolks ⋅ 昨天 ⋅ 0

大数据入门基础:SSH介绍

什么是ssh 简单说,SSH是一种网络协议,用于计算机之间的加密登录。 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码...

董黎明 ⋅ 昨天 ⋅ 0

web3j教程

web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 汇智网最新发布的web3j教程,详细讲解...

汇智网教程 ⋅ 昨天 ⋅ 0

谷歌:安全问题机制并不如你想象中安全

腾讯科技讯 5月25日,如今的你或许已经对许多网站所使用的“安全问题机制”习以为常了,但你真的认为包括“你第一个宠物的名字是什么?”这些问题能够保障你的帐户安全吗? 根据谷歌(微博)安...

问题终结者 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部