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

来源:互联网 发布:python 获取期货数据 编辑:程序博客网 时间:2024/04/29 05:34
#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;}

0 0