博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV 下面的图像亮度变换 Intensity transformation
阅读量:6079 次
发布时间:2019-06-20

本文共 2684 字,大约阅读时间需要 8 分钟。

亮度变换是指图像在空域上的点运算,通常包括图像增强、亮度/对比度、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 
调整图像的亮度值.

 
 
 
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"


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( 
0; 
src->height; 
y++)

 
 
 
{

 
 
 
 
 
 
 
for 
(x 
0; 
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 
!= 
|| 
(src=cvLoadImage(argv[1], 
0)) 
== 
NULL) 
// 
force 
to 
gray 
image

 
 
 
 
 
 
 
return 
-1;

 
 
 

 
 
 
cvNamedWindow( 
"src", 
);

 
 
 
cvNamedWindow( 
"result", 
);

 
 
 

 
 
 
// 
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]

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


本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2009/01/02/1586395.html,如需转载请自行联系原作者

你可能感兴趣的文章
IPv4地址
查看>>
MongoDB——第五天 主从复制
查看>>
mysql常用命令操作
查看>>
学习笔记2:java中Thread类与线程的创建
查看>>
php 不支持 curl 的终极解决方案
查看>>
安装mantis 2.11.1
查看>>
zabbix 3.4监控zookeeper3.4
查看>>
mysql 环境变量配置
查看>>
Openstack 之 使用disk-image-builder(DIB)制作镜像
查看>>
看看我最关心的动态库中到底有多少函数 - winmm.dll
查看>>
OpenStack企业私有云
查看>>
全局探色器
查看>>
cocos2d-x项目101次相遇:3.0 的点击事件,CCTouchDelegate已经停用了
查看>>
Mysql 总结
查看>>
再学 GDI+[22]: TGPLinearGradientBrush - 之一: TLinearGradientMode
查看>>
百度地图的官方使用
查看>>
对于X的一些理解与总结
查看>>
红帽挑战赛-比赛训练安排
查看>>
Cisco IOS特性介绍
查看>>
我的友情链接
查看>>