您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VB > 正文
VB图像处理之图像的亮度对比度调整
[文章信息]
作者:WallesCai
时间:2005-01-19
出处:CSDNBLOG
责任编辑:方舟
[文章导读]
在图像处理中,恐怕大家最熟悉的就是对于图像的亮度和对比度调整了
advertisement
热点推荐
· 迷你迅雷给IE下载加足马力
· 《大话李白》主题曲 Flash
· Windows操作系统小技巧荟萃(上)
· 新浪UC2005使用技巧四则
· Google 2秒钟搜索100G硬盘
[正文]
  在图像处理中,恐怕大家最熟悉的就是对于图像的亮度和对比度调整了。

  前面一定也有很多人写过这样的文章了,但是想把我的这个系列作一个完整的小结,我就再罗嗦一番了。

  还是以24位色图像为例子,每种色彩都可以用0-255,一共256种深度来表示。如果我们把它画在一个二维坐标上,正好是一条直线。

  比如我们将像素的色深作为横坐标,输出色深作为纵坐标的画,正好是一条经过原点(0,0)的45度斜线。


  如图中直线A所表示的,角T为45度,表示它的对比度正好为1。那么很容易就可以写出它的直线方程:Out = In * 1 ,系数1就是对比度的概念如果把条直线加上一个偏移量变成B,那么它的直线方程就成为:Out = In * 1 + (ab) 偏移量(ab)就是亮度的增量。

  只要有初中的代数知识就很容易看出它满足一条直线方程:Y= A * X + B。

  但是,我们这里要处理的情况稍微有些不同,在图像处理中,对比度和亮度要分别对待。不能因为改变而改变亮度,因为我们习惯上把灰色(127,127)这一点作为中心点。比如,我们加大了对比度,原来的直线A就变成如直线D所表示的,在改变了对比度的同时,也增加了亮度(ab),而我们心目中的变化应该是入直线C那样。也就是说,我们把(127,127)这一点映射成了坐标系的原点。

  那么我们就要把原来的直线公式修改成:Y=( X - 127 ) * A + B + 127。A表示对比度,B表示亮度增量。我们验证一下:只要亮度增量 B=0,无论怎么改变对比度 A,该直线始终通过中心点(127,127),也就是说改变对比度的同时,亮度没有改变。

  由此,我们就可以推导出颜色的对比度亮度计算公式了:

NewRed = (OldRed -127 ) * A + 127+ B
NewGreen = (OldGreen -127 ) * A + 127+B
NewBlue = (OldBlue -127 ) * A + 127+B

  现在你是否已经准备着手用这个公式来写出你自己的亮度对比度子程序了呢?

  慢着,再多做一步吧。我们是在遍程序,不是在做初中代数考试。这多出来的一步将使你的程序的执行效率更高一些。

  我们把上面的公式再推导一下:

  Y=( X - 127 ) * A + B + 127 => Y = X * A - 127 * A + 127+B (1)

  令:B = B -127 * A +127 (2)

  由上面(1),(2)两步,得到一个新的公式:Y = X * A + B

  咦?怎么又变回来了??

  是的公式的形式确实是变回来了,不过B所代表的东西已经不同了。

  或许你又会说我这是多此一举,请聪明的读者想像一下:在一个普通的图片做亮度对比度运算的时候,我们上面这些小小的变化将带来什么样的效率提升。假设一张图片大小是1027*768

  一共有786432个像素,而每个像素又要分别计算红绿蓝三种颜色。

  那么,上述这个公式就需要计算786432 * 3 = 2359296 次,经过这么多次运算的放大,哪怕是小小的一个重复计算都将浪费很长的时间。

  因为在调用子程序的时候亮度和对比度都已经确定,那么B = B -127 * A +127这一步就可以放在循环的外面先作好。从而减少了程序的运算时间。

  下面给出我的程序,以供参考:

Public Sub BrightnessAndContrast(ByVal RedOffset As Long, ByVal GreenOffset As Long, ByVal BlueOffset As Long, Optional ByVal RedContrast As Single = 1, Optional ByVal GreenContrast As Single = 1, Optional ByVal BlueContrast As Single = 1)
 Dim X As Long
 Dim Y As Long
 Dim MidR As Integer
 Dim MidG As Integer
 Dim MidB As Integer
 Dim Max As Long
 On Error GoTo ErrLine
 Done = False
 TimeFilter = timeGetTime
 MidR = RedOffset - 127 * (RedContrast - 1) '计算新的位移量B
 MidG = GreenOffset - 127 * (GreenContrast - 1)
 MidB = BlueOffset - 127 * (BlueContrast - 1)
 Max = 255
 For X = 0 To OutPutWid
  For Y = 0 To OutPutHei
   R = ColOut(2, X, Y)
   G = ColOut(1, X, Y)
   B = ColOut(0, X, Y)
   R = R * RedContrast + MidR '计算Y = X * A + B
   G = G * GreenContrast + MidG
   B = B * BlueContrast + MidB
   If R > Max Then R = Max '输出值判断是否在0到255之间
   If R < 0 Then R = 0
   If G > Max Then G = Max
   If G < 0 Then G = 0
   If B > Max Then B = Max
   If B < 0 Then B = 0
   ColOut(2, X, Y) = R
   ColOut(1, X, Y) = G
   ColOut(0, X, Y) = B
  Next
 Next
 Done = True
 TimeFilter = timeGetTime - TimeFilter
 Exit Sub
ErrLine:
 MsgBox Err.Description
 Done = True
End Sub

  因为在亮度对比度的过程中会出现计算值超出(0,255)的范围,因此需要对它做一个判断,把结果限定在这个范围之内。

  这个程序很简单,可以根据给定的红绿蓝的亮度偏移量和对比度参数计算。由于把三种颜色的6个参数分开,也可以只调整单独的一种颜色。

  还有一个好处,就是当你将对比度参数设为负值的时候,可以直接得到原图片的反色输出。(这也是将前面的坐标系原点移动到127这一点的一个好处。)

  下面是用我的程序处理得到的效果:

  原图:


  亮度+20,对比度1.5效果:


  对比度 -1,反相色彩效果:


  作为这个系列的最后一篇文章,我在我的程序ImageCast中所用到的所效果的算法和主要代码都已经贴出来了。也算是对自己对大家的一个小小交待吧。


天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • VB实现文件数据对SQL Server上传下载
  • 用VB6.0编写磁盘格式化程序
  • 在VB6中实现Kodak控件编程
  • VB图像处理之图像的色彩纠正
  • VB图像处理之铅笔画算法和木雕算法
  • 寄出钱易趣说没收到 网上购物“优惠”遭质疑
  • 内地C2C网站集体对接海外 扩展两岸三地市场
  • 企业信息化时代的新兴职业:客户关系管理师
  • 诺基亚光辉岂止区区15年 CEO奥利拉不信邪
  • CN域名注册价格大跳水 将与.COM域名持平
  • 中国将制定首个国家信息化战略 年底前发布
  • 04年中国企业十大新闻揭晓 联想收购列第一
  • 跨国公司在华兴独资浪潮 欧盟与日本打头阵
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索