网站建设| 数据库类| 图形图象| 程序设计| 现代办公| 操作系统| 考试认证| 网络技术| 软件工程| 电脑相关| 文学作品
网站开发| 网页制作| 操作系统| 图象图形| 考试认证| 数据库类| 程序设计| 硬件技术| 现代办公| 网络技术| 笑话频道
 
您的位置: 电脑书库首页-> 电脑文摘-> 程序设计-> Basic/VB类-> VB图像处理之图像的亮度对比度调整

VB图像处理之图像的亮度对比度调整
作者:佚名 来源:InterNet 加入时间:2005-1-28
相关文章
  • VB实现文件数据对SQL Server上传下载
  • 用VB6.0编写磁盘格式化程序
  • VB图像处理之图像的色彩纠正
  • VB图像处理之铅笔画算法和木雕算法
  • VB图像处理之几个常用滤镜的实现
  • VB图像处理之二次线性插值的应用
  • VB图像处理之像素的获取和输出
  • VB实现图像在数据库的存储与显示
  • 利用VB6.0开发基于IIS的应用程序
  • VB6中用Oracle数据控件访问Oracle
  • 相关书籍:
  • VBScript语言参考
  • VBScript函数速查手册
  • VBScript5.5脚本语言参考
  • VB上机考试综合应用题选讲
  • vb另外两套教案
  • VB光盘资料库
  • VB、C快速进阶 2.0
  • Web 对象 VB参考
  • VB编程技巧集(中)--站长推荐
  • VB编程技巧集(上)--站长推荐
  • 在图像处理中,恐怕大家最熟悉的就是对于图像的亮度和对比度调整了。

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

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

    [文章录入员:nancy]

    相关文章
  • VB实现文件数据对SQL Server上传下载
  • 用VB6.0编写磁盘格式化程序
  • VB图像处理之图像的色彩纠正
  • VB图像处理之铅笔画算法和木雕算法
  • VB图像处理之几个常用滤镜的实现
  • VB图像处理之二次线性插值的应用
  • VB图像处理之像素的获取和输出
  • VB实现图像在数据库的存储与显示
  • 利用VB6.0开发基于IIS的应用程序
  • VB6中用Oracle数据控件访问Oracle
  • 相关书籍:
  • VBScript语言参考
  • VBScript函数速查手册
  • VBScript5.5脚本语言参考
  • VB上机考试综合应用题选讲
  • vb另外两套教案
  • VB光盘资料库
  • VB、C快速进阶 2.0
  • Web 对象 VB参考
  • VB编程技巧集(中)--站长推荐
  • VB编程技巧集(上)--站长推荐
  • 本站推荐内容

    近期主机类热搜关键词:
    美国服务器 美国服务器租用 海外服务器租用 国外服务器租用

    Basic/VB类
    C/C++/VC
    C++Builder
    Basic/VB类
    Delphi/Pascal
    Java编程
    FORTRAN
    其它
    电脑教程阅读排行
    ·VB学习一点通
    ·VB设计动画时钟
    ·在Visual Basic 6....
    · 用VB6.0编写手机短信发送 ...
    ·VB实现文件数据对SQL Ser...
    ·利用Visual Basic操作...
    ·VB实现图像在数据库的存储与显示
    ·用Visual Basic6.0...
    ·Visual Basic代码优化...
    · VB中实现“无标题”窗体的移动...