首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > OpenCV 下面的图像亮度变换 Intensity transformation
【标  题】:OpenCV 下面的图像亮度变换 Intensity transformation
【关键字】:OpenCV,Intensity,transformation
【来  源】:http://blog.csdn.net/hunnish/archive/2006/11/21/1402420.aspx

OpenCV 下面的图像亮度变换 Intensity transformation

   亮度变换 intensity transformation

亮度变换是指图像在空域上的点运算,通常包括图像增强、亮度/对比度、GAMMA值调节、直方图调整等等。下面给出两个例子说明如何改变图像的亮度、对比度以及如何进行图像的GAMMA值调节。

亮度变换的原理可以参考MATLAB中的函数 imadjust.m,下面给出一个例子说明如何进行亮度变换的。

MATLAB窗口中键入:

 

>> imadjdemo;

 

进行亮度变换演示。调整“Intensity Transform”窗口中的曲线,可以对图像进行亮度变换,这里调整的参数是 gamma =1, X-方向是 [0,0.5]Y-方向是[0.5,1],得到的结果如下:

 

5?13 MATLAB中的亮度变换演示 Imadjdemo.m

MATLAB中也可以用imadjust 来得到同样结果,我们先看看函数imadjust的说明,给出的英文已经翻译过来:

 

>>help imadjust

>> IMADJUST 调整图像的亮度值.

    J = IMADJUST(I,[LOW_IN HIGH_IN],[LOW_OUT HIGH_OUT],GAMMA) 将图像I 的亮度值映射到新的图像J中,使得在 LOW_IN HIGH_IN 之间(即X-方向)的值映射到 LOW_OUT HIGH_OUT (即Y-方向)之间。小于 LOW_IN 以及大于 HIGH_IN 的值被裁剪调。GAMMA 表示曲线的形状,该曲线描述IJ之间的关系。如果 GAMMA 小于1, 则映射的权重趋向更亮的输出,如果GAMMA 大于1,则映射趋向更暗的输出。如果省略GAMMA,则默认值为 1

注意:如果 HIGH_OUT < LOW_OUT,则图像输出反转,即通常所说的负片。但是 LOW_IN 必须小于 HIGH_IN

 

实际上图像的亮度和对比度调节就是一种亮度变换,可以直接调整 [LOW_IN, HIGH_IN] [LOW_OUT, HIGH_OUT] 的数值来改变亮度以及对比度。这里不再叙述了,读者可以自行测试。

 

下面我们在MATLAB上用imadjust实现图5?14的输出结果:

>>I = imread(‘rice.tif’);

>>J = imadjust(I,[0 0.5],[0.5 1]);  % X方向是在[0,0.5]之间,Y方向在[0.5,1]之间

>> imshow(I);

>> figure, imshow(J);

 

运行后得到如下结果:

      

下面我们编制在OpenCV 下面的程序,以实现图像的亮度变换:

例子 imadjust.c 图像的亮度变换

>>>>>>>>>>>>>>>

#include "cv.h"

#include "highgui.h"

/*

  src and dst are grayscale, 8-bit images;

  Default input value:

           [low, high] = [0,1];  X-Direction

           [bottom, top] = [0,1]; Y-Direction

           gamma ;

  if adjust successfully, return 0, otherwise, return non-zero.

*/

int ImageAdjust(IplImage* src, IplImage* dst,

           double low, double high,   // X方向low and high are the intensities of src

           double bottom, double top, // Y方向mapped to bottom and top of dst

           double gamma )

{

if(   low<0 && low>1 && high <0 && high>1&&

bottom<0 && bottom>1 && top<0 && top>1 && low>high)

        return -1;

    double low2 = low*255;

    double high2 = high*255;

    double bottom2 = bottom*255;

    double top2 = top*255;

    double err_in = high2 - low2;

    double err_out = top2 - bottom2;

 

    int x,y;

    double val;

 

    // intensity transform

    for( y = 0; y < src->height; y++)

    {

        for (x = 0; x < src->width; x++)

        {

            val = ((uchar*)(src->imageData + src->widthStep*y))[x];

            val = pow((val - low2)/err_in, gamma) * err_out + bottom2;

            if(val>255) val=255; if(val<0) val=0; // Make sure src is in the range [low,high]

            ((uchar*)(dst->imageData + dst->widthStep*y))[x] = (uchar) val;

        }

    }

    return 0;

}

 

int main( int argc, char** argv )

{

    IplImage *src = 0, *dst = 0;

   

    if( argc != 2 || (src=cvLoadImage(argv[1], 0)) == NULL)  // force to gray image

        return -1;

   

    cvNamedWindow( "src", 1 );

    cvNamedWindow( "result", 1 );

   

    // Image adjust

    dst = cvCloneImage(src);

    // 输入参数 [0,0.5] [0.5,1], gamma=1

if( ImageAdjust( src, dst, 0, 0.5, 0.5, 1, 1)!=0) return -1;

   

    cvShowImage( "src", src );

    cvShowImage( "result", dst );

    cvWaitKey(0);

 

    cvDestroyWindow("src");

    cvDestroyWindow("result");

    cvReleaseImage( &src );

    cvReleaseImage( &dst );

   

    return 0;

}

 

如果输入的参数设置为:

[LOW_IN, HIGH_IN] = [0,1] [LOW_OUT, HIGH_OUT] = [1,0]

那么得到输入图像的反转片,运行得到图像反转。

    

5?17 图像的反转

 
STL对字符串排序:【上一篇】
MFC程序的构造过程和运行机理初探:【下一篇】
【相关文章】
  • OPENCV 1.0 RC1 版本安装时的编译错误修正
  • OPENCV 中的图像旋转与缩放
  • OPENCV 1.0 RC1 版本介绍
  • 为Dev-C++安装设置OpenCV
  • WINX支持DirectX,OpenCV吗?
  • WINX中使用OpenCV的一个样例
  • 边缘检测——OpenCV例子学习
  • linux下的OpenCV安装&学习笔记(修订版,解决无法打开视频文件问题)
  • OpenCV学习笔记——交换一幅图片的红蓝通道
  • OpenCV学习笔记——显示一幅图片
  • 【随机文章】
  • mc使用方法
  • 传输线的阻抗控制介绍
  • GMA900 Linux下的宽屏实现方案--915resolution使用日记
  • 光纤的损耗(3)
  • 我没有很想你
  • VBScript和JavaScript 的比较
  • Jdon应用系统案例开发
  • 天堂2 攻防等计算公式介绍
  • 开机时自动登录系统
  • Oracle9i初始化参数中文说明(9)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.