亮度变换是指图像在空域上的点运算,通常包括图像增强、亮度/对比度、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做的图片柱面投影变换,可以运行,内含多幅图片
OpenCV傅里叶变换及逆变换实现代码,机器视觉使用
基于OpenCV的图像仿射变换,包括图像的旋转等。
基于openCV的小波变换和逆变换,实现对输入图像的多层小波变换和逆变换重构,适用于图像处理、融合、识别等。
OPenCV 实现图像的镜像梯度变换,源码非常实用的
用opencv实现图像的傅里叶变换的程序
基于c++和opencv实现低亮度图像增强源码(课程设计作业).zip基于c++和opencv实现低亮度图像增强源码(课程设计作业).zip基于c++和opencv实现低亮度图像增强源码(课程设计作业).zip基于c++和opencv实现低亮度图像增强...
通过彩色图像的直方图均衡化,创建一副在整个亮度范围内具有相同分布的亮度图像。
基于OPENcv的顶帽变换求图像的边缘算法
在win32控制台程序中,opencv中基于距离变换与分水岭变换的图像分割代码
opencv调整图像亮度和对比度详解,包括亮度和对比度概念,改变亮度和对比度,像素值转化等,欢迎下载学习。
基于VS2013 opencv3写出来的有关图像旋转、缩放、内凹、外凸等图像的几何变换的代码
自己写的测试代码,里面有详细说明。不明白了可以发邮件给我,邮箱在文档里。
使用opencv中霍夫线变换检测直线,阈值可调
基于opencv的傅里叶变换和逆变换,有详细的代码解释。
基于VC6+opencv1.0 实现网上流传的算法,简单容易理解,但速度稍慢
在openCV平台下的小波变换函数,可以进行图像的小波分解和重构!
在VC++6.0和opencv1.0版本基础上实现小波变换
OpenCV-Python图像透视变换处理:魔变车牌案例.rar