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

王亲亲OYE7

王亲亲OYE7

2016-02-19 14:21

人生本是一个不断学习的过程,在这个过程中,图老师就是你们的好帮手,下面分享的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这一步就可以放在循环的外面先作好。从而减少了程序的运算时间。
  
  下面给出我的程序,以供参考:
  
  ->PublicSubBrightnessAndContrast(ByValRedOffsetAsLong,ByValGreenOffsetAsLong,ByValBlueOffsetAsLong,OptionalByValRedContrastAsSingle=1,OptionalByValGreenContrastAsSingle=1,OptionalByValBlueContrastAsSingle=1)
   DimXAsLong
   DimYAsLong
   DimMidRAsInteger
   DimMidGAsInteger
   DimMidBAsInteger
   DimMaxAsLong
   OnErrorGoToErrLine
   Done=False
   TimeFilter=timeGetTime
   MidR=RedOffset-127*(RedContrast-1)'计算新的位移量B
   MidG=GreenOffset-127*(GreenContrast-1)
   MidB=BlueOffset-127*(BlueContrast-1)
   Max=255
   ForX=0ToOutPutWid
  ForY=0ToOutPutHei
   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
   IfRMaxThenR=Max'输出值判断是否在0到255之间
   IfR0ThenR=0
   IfGMaxThenG=Max
   IfG0ThenG=0
   IfBMaxThenB=Max
   IfB0ThenB=0
   ColOut(2,X,Y)=R
   ColOut(1,X,Y)=G
   ColOut(0,X,Y)=B
  Next
   Next
   Done=True
   TimeFilter=timeGetTime-TimeFilter
   ExitSub
  ErrLine:
   MsgBoxErr.Description
   Done=True
  EndSub->
  因为在亮度对比度的过程中会出现计算值超出(0,255)的范围,因此需要对它做一个判断,把结果限定在这个范围之内。
  
  这个程序很简单,可以根据给定的红绿蓝的亮度偏移量和对比度参数计算。由于把三种颜色的6个参数分开,也可以只调整单独的一种颜色。
  
  还有一个好处,就是当你将对比度参数设为负值的时候,可以直接得到原图片的反色输出。(这也是将前面的坐标系原点移动到127这一点的一个好处。)
  
  下面是用我的程序处理得到的效果:
  
  原图:
  
  ->->
  亮度+20,对比度1.5效果:
  
  ->->
  对比度-1,反相色彩效果:
  
  ->->
  作为这个系列的最后一篇文章,我在我的程序ImageCast中所用到的所效果的算法和主要代码都已经贴出来了。也算是对自己对大家的一个小小交待吧。->

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
VB图像处理之图像的亮度对比度调整

VB图像处理之图像的色彩纠正

编程语言 网络编程
VB图像处理之图像的色彩纠正

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Photoshop初学者教程:解析亮度对比度的原理

PS PS基础
Photoshop初学者教程:解析亮度对比度的原理

VB图像处理之几个常用滤镜的实现

编程语言 网络编程
VB图像处理之几个常用滤镜的实现

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

教你如何协调好前期拍摄:调整亮度与对比度

摄影 人像摄影 静物摄影
教你如何协调好前期拍摄:调整亮度与对比度

ps怎么调节亮度与对比度

PS教程 PS基础
ps怎么调节亮度与对比度

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

VB精彩教程:数据异步加载

VB精彩教程:数据异步加载

苹果雪豹系统重建桌面的快捷键是什么

苹果雪豹系统重建桌面的快捷键是什么
下拉加载更多内容 ↓