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

2016-02-19 14:21 152 1 收藏

人生本是一个不断学习的过程,在这个过程中,图老师就是你们的好帮手,下面分享的VB图像处理之图像的亮度对比度调整懂设计的网友们快点来了解吧!

【 tulaoshi.com - 编程语言 】

在图像处理中,恐怕大家最熟悉的就是对于图像的亮度和对比度调整了。
  
  前面一定也有很多人写过这样的文章了,但是想把我的这个系列作一个完整的小结,我就再罗嗦一番了。
  
  还是以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中所用到的所效果的算法和主要代码都已经贴出来了。也算是对自己对大家的一个小小交待吧。->

来源:http://www.tulaoshi.com/n/20160219/1606807.html

延伸阅读
在这一篇中我将和大家讲述铅笔画算法和木雕算法和它们的实现。为什么我要把这两个算法放在一起说呢,因为这两个算法是非常相似的。首先要说一下人的眼睛对于图像的观察,人的眼睛对于灰度(亮度)的敏感要远远大于对色彩的敏感,而人的眼睛对于暖色调和冷色调的敏感有要远大于对一般色彩的敏感度。 经过大量的测试,人们得到了一个经验...
1、首先打开PS工具,导入图片。选择文件打开。 2、可以通过打开路径,打开保存目录下的图片。 3、也可以通过直接拖动图片到PS工具中打开图片。 4、编辑选择图像-->调整-->自然饱和度。 5、图一的饱和比率效果图 6、图二饱和比率效果图 7、图三饱和比率效果图,更具自己的喜好选择比较合适的饱和比...
标签: PS PS教程
  相关教程链接: Photoshop基础教程:曲线调整实战攻略之亮度篇   Photoshop基础教程:曲线调整实战攻略之反相篇 Photoshop基础教程:曲线调整实战攻略之饱和度篇 Photoshop基础教程:曲线调整实战攻略之对比度篇   (本文) Photoshop基础教程:曲线调整实战攻略之颜色调整篇 Photoshop基...
VB提供了相当强的文字输出和绘图功能,可以在窗口或图形框中利用各种命令显示字体或绘制各种图形。灵活使用这些命令,不仅可以完成许多特殊的功能,而且可以为Windows的程序界面增加许多活力。下面用简单的例子演示VB中随机动画的风采。 (一)、随机文字动画 在VB中可利用Print命令进行字符串的显示工作,此命令一般只在当前位置显示字...
素材图片有点曝光不足,总体有点偏暗,人物细节不够清晰。作者处理的时候用多个复制图层叠加来增强图片的对比度,然后再微调图片的颜色即可。 原图 最终效果 1、打开原图,复制一个图层。 2、图层模式设为:滤色。 3、再复制一层,图层模式设为:叠加,不透明度:50%。 4、再复制一层,图层模式设为:叠加...

经验教程

591

收藏

6
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部