`
ihuashao
  • 浏览: 4665896 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多
亮度变换是指图像在空域上的点运算,通常包括图像增强、亮度/对比度、GAMMA值调节、直方图调整等等。下面给出两个例子说明如何改变图像的亮度、对比度以及如何进行图像的GAMMA值调节。
亮度变换的原理可以参考MATLAB中的函数 imadjust.m,下面给出一个例子说明如何进行亮度变换的。
在MATLAB窗口中键入:

>> imadjdemo;

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

中的亮度变换演示 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 表示曲线的形状,该曲线描述I和J之间的关系。如果 GAMMA 小于1, 则映射的权重趋向更亮的输出,如果GAMMA 大于1,则映射趋向更暗的输出。如果省略GAMMA,则默认值为 1。
注意:如果 HIGH_OUT < LOW_OUT,则图像输出反转,即通常所说的负片。但是 LOW_IN 必须小于 HIGH_IN。

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

上用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]
那么得到输入图像的反转片,运行得到图像反转。
分享到:
评论

相关推荐

    python_opencv_图像亮度提升_

    本主题将深入探讨如何使用Python结合OpenCV库来实现图像亮度提升,我们将关注以下知识点: 1. **OpenCV简介**:OpenCV(开源计算机视觉库)是一个跨平台的计算机视觉库,提供了众多图像和视频处理的功能。它支持...

    基于OPENCV的图片柱面变换

    在计算机视觉领域,OpenCV(开源计算机视觉库)是一个强大的工具,它提供了丰富的函数和算法,用于处理图像和视频数据。本项目聚焦于一个特定的图像变换技术——柱面投影,这是一种将平面图像映射到柱体表面的技术,...

    openCV傅里叶变换及逆变换

    在图片处理中,傅里叶变换也可以用于图像滤波、图像去噪等操作。对于图片变换,需要将图片转换为IplImage格式,然后使用两个单通道图片来分别表示实部和虚部,用两通道图片来存放变换结果。 在给定的代码中,首先...

    OpenCV彩色图像亮度均衡

    通过对直方图的分析和变换,我们可以有效地处理亮度不均的彩色图像,使其在视觉上更加清晰,同时也有助于后续图像处理步骤的精确性。在实际操作中,开发者可以根据具体需求选择合适的直方图均衡化方法。

    openCV图像的小波变换和逆变换

    ### OpenCV中的图像小波变换和逆变换 #### 一、引言 在图像处理领域,小波变换是一种非常强大的工具,它可以帮助我们提取图像的关键特征,并进行多种图像处理任务,如去噪、压缩、边缘检测等。OpenCV库提供了丰富的...

    基于opencv的图像傅里叶变换

    **图像傅里叶变换在OpenCV中的应用** 在计算机视觉领域,傅里叶变换是一种重要的图像处理技术,它能够将图像从空间域转换到频率域,揭示图像的频率成分。OpenCV库,一个广泛用于图像处理和计算机视觉的开源库,提供...

    基于OpenCv图像仿射变换

    本文将深入探讨如何利用OpenCV进行图像的仿射变换,其中包括图像的旋转。仿射变换是一种线性映射,可以保持图像的直线性和平行性,它在图像校正、几何矫正和视图合成等方面有着广泛的应用。 **OpenCV简介** OpenCV...

    基于opencv的bmp图像梯形变换

    **OpenCV BMP图像处理——梯形变换详解** 在计算机视觉领域,图像变形是常见的操作之一,其中梯形变换是用于图像校正、拼接或艺术效果的重要技术。本篇文章将详细探讨如何使用OpenCV库对BMP图像进行梯形变换,并以...

    基于opencv的傅里叶变换和逆变换

    基于OpenCV库实现的傅里叶变换与逆变换在图像处理领域中占据着核心地位,尤其是在频域分析、滤波以及图像特征提取等应用中。本文将深入解析OpenCV中的傅里叶变换及其逆变换的实现原理,并通过具体的代码示例进行详细...

    opencv 图像的几何变换

    本主题将深入探讨如何使用OpenCV进行图像的几何变换,主要包括图像的旋转、缩放、内凹变形和外凸变形。我们将使用C++语言,并在Visual Studio 2013环境下进行开发,使用的OpenCV版本为3。 首先,图像旋转是改变图像...

    opencv,摄像头清晰度检测,亮度异常检测系统,mfc展示平台

    图像采集部分使用摄像头拍摄图像,图像处理部分使用OpenCV库中的算法进行图像处理和分析,并计算出清晰度和亮度异常指标。图像展示部分使用MFC作为展示平台,提供了一个友好的用户界面,能够实时显示检测结果。 六...

    opencv实现图像傅里叶变换

    下面我们将深入探讨如何使用OpenCV实现图像的傅里叶变换,并了解其背后的理论。 傅里叶变换是一种数学变换,用于将信号分解为不同频率的正弦波之和。在图像处理中,傅里叶变换可以揭示图像中的高频和低频成分。高频...

    基于c++和opencv实现低亮度图像增强源码(课程设计作业).zip

    基于c++和opencv实现低亮度图像增强源码(课程设计作业).zip基于c++和opencv实现低亮度图像增强源码(课程设计作业).zip基于c++和opencv实现低亮度图像增强源码(课程设计作业).zip基于c++和opencv实现低亮度图像增强...

    OPenCV 实现图像的镜像梯度变换

    在本主题中,我们将深入探讨如何利用OpenCV实现图像的镜像梯度变换,这是一种图像处理技术,常用于边缘检测、图像增强等应用场景。 镜像梯度变换是一种特殊的图像操作,它涉及到对图像进行水平或垂直翻转,然后计算...

    opencv中基于距离变换与分水岭变换的图像分割代码

    在win32控制台程序中,opencv中基于距离变换与分水岭变换的图像分割代码

    基于OPENcv的顶帽变换求图像的边缘算法_OPENcv顶帽_opencv_blanketxai_

    在OpenCV库中,顶帽变换是一种结合了原图像与它的闭运算结果来获取图像内部细微变化的方法。这个过程对于识别图像中的微小噪声、小物体或者边缘断裂部分特别有用。在本文中,我们将深入探讨基于OpenCV实现顶帽变换求...

    OpenCV_Pic_Perspective_Transformation-master.zip

    《OpenCV图片透视变换实战详解》...通过这个"OpenCV_Pic_Perspective_Transformation-master"项目,你可以深入学习如何使用OpenCV进行图片的透视变换,掌握图像处理的核心技术,为后续的计算机视觉项目打下坚实的基础。

    小波变换(VC+OPENCV)

    在计算机视觉(CV)和图像处理中,OpenCV库是常用的选择,它提供了丰富的功能,包括小波变换的实现。而在编程环境中,Visual C++ 6.0(VC++6.0)经常被用于开发这样的应用。 小波变换的基本概念: 小波变换是傅立叶...

    opencv调整图像亮度和对比度实例下载

    本教程将深入探讨如何使用OpenCV来调整图像的亮度和对比度,这对于图像预处理和增强图像视觉效果至关重要。 首先,理解亮度和对比度的基本概念是至关重要的。亮度指的是图像的整体明暗程度,它影响了图像中的所有...

    opencv实现小波变换

    本代码段展示了如何在OpenCV环境下使用C++语言实现小波变换,通过对图像进行多层小波分解,可以有效提取图像的高频和低频信息,为后续的图像处理任务提供基础。然而,需要注意的是,代码中使用的是旧版OpenCV库接口...

Global site tag (gtag.js) - Google Analytics