VB图像处理之图像的亮度对比度调整

http://tech.ddvip.com   2006年07月30日    社区交流

本文详细介绍VB图像处理之图像的亮度对比度调整

  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中所用到的所效果的算法和主要代码都已经贴出来了。也算是对自己对大家的一个小小交待吧。

作者:WallesCai    责编:豆豆技术应用

正在加载评论...