您的位置:首页 > 运维架构

Opencv学习手册(四)--- 图像灰度变换

2015-11-12 09:50 826 查看
#include <opencv2/opencv.hpp>
using namespace cv;

/*
灰度变换函数ImageAdjust
其中,源图像src和目标图像dst均为8比特的灰度图像
默认的参数值有:
[low, high] = [0,1];
[bottom, top] = [0,1];
线性变换:将源灰度值的[low, high]区间线性变换到[bottom, top]区间
如果变换成功,返回0,否则返回非零值。
*/
int ImageAdjust(IplImage* src, IplImage* dst, double low, double high, double bottom, double top)
{
if(	low<0 || low>1 || high <0 || high>1 || bottom<0 || bottom>1 || top<0 || top>1 || low>=high)
return -1;//输入参数值不符合函数要求,则返回失败值

//将输入参数缩放到8比特图像的灰度级别[0, 255]上
double low2 = low*255;
double high2 = high*255;
double bottom2 = bottom*255;
double top2 = top*255;
double k = (top2 - bottom2)/(high2 - low2);//计算直线斜率

int x,y;
double val;

//对图像中的像素逐个进行灰度变换
for( y = 0; y < src->height; y++)//y为像素的纵坐标
{
for (x = 0; x < src->width; x++)//x为像素的横坐标
{
val= (uchar) src->imageData [ src->widthStep*y + x]; //得到源图像中像素点(x, y) 的灰度值

if(val>=1&&val<=125)
val=0;
if(val>125&&val<=255)
val=255;

//val = (val - low2)* k + bottom2;
//val = 255-val;//图像求反

//越界处理,保证灰度值落在有效的灰度级别内
if(val>255)   val=255;
if(val<0)    val=0;

dst->imageData[ dst->widthStep*y + x] = val;//对目标图像的像素点(x, y)重新赋灰度值
}
}
return 0;
}

int main( int argc, char** argv )
{
argv[1]="test.jpg";
IplImage *src = 0, *dst = 0;

if( argc != 2 || (src=cvLoadImage(argv[1], 0)) == NULL)//参数0表示强制转换为单通道灰度图像
return -1;//指定读取灰度图像,否则程序退出

cvNamedWindow( "src", 1 );
cvNamedWindow( "result", 1 );

//以下为图像增强过程
//先复制源图像
dst = cvCloneImage(src);

//输入参数 [0,0.5] 和 [0.5,1]进行灰度变换
if( ImageAdjust( src, dst, 0, 0.5, 0.5, 1)!=0)
return -1;

cvShowImage( "src", src );
cvShowImage( "result", dst );
cvWaitKey(0);

cvDestroyWindow("src");
cvDestroyWindow("result");
cvReleaseImage( &src );
cvReleaseImage( &dst );

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: