基于OpenCV实现图像线性变化

来源:互联网 发布:js 删除所有class 编辑:程序博客网 时间:2024/05/16 01:53
基础知识:
线性灰度变换函数f(x)是一个一维线性函数
y=f(x)=ax+b
式中;a为线性函数的斜率,b为线性函数在y轴的截距,x表示输入图像的灰度值,y表示输出图像的灰度值。
(1) 当a>1时,输出图像的对比度将增加;当a<1时,输出图像的对比度将减小。
        (2) 当a=1时,且b不等于0时,操作仅仅使得所有的像素灰度值上移或者下移,其效果使得整个输出图像更亮或者更暗
(3) 当a<1时,暗区域将变亮,亮区域将变暗,这种线性改变亮度可能由于像素亮度达到饱和(小于0或者大于255)而丢失一部分细节。
         (4)特殊情况下,当a=1,b=0时,输入图像和输出图像一致;
                                       当a=-1,b=255,输出图像的灰度正好反转。灰度反转处理适用于增强暗色图像中的亮度较大的细节部分,这也是由人的视觉特性决定的。

/*----------------------------------------------------------------------------------------------* 程序说明:基于OpenCV实现图像线性变化*开发环境:*        win7+vs2010+opencv2.4.8*创建时间地点:*        陕西师范大学.2017.2.28*参考资料:*        《数字图像处理与计算机视觉》张铮,徐超-----那本蓝色书66页的算法*作    者:*        李先生-----------------------------------------------------------------------------------------------*/#include<opencv2\highgui\highgui.hpp>#include<opencv2\imgproc\imgproc.hpp>#include<opencv2\imgproc\imgproc_c.h>//using namespace std;using namespace cv;/*----------------------------------线性变换函数的声明----------------------------------------*函数原型*   bool LinTran(IplImage *srcImage, double a,double b);*参数*       double a:线性变换的斜率*    double b:线性变换的截距*返回值类型    *       bool类型;true为成功,false为失败--------------------------------------------------------------------------------------------*/bool LinTran(IplImage *srcImage, double a,double b);//---------------------------------【Main 函数】------------------------------------------------//                                 我们的程序从这里开始执行//------------------------------------------------------------------------------------------------int main(){IplImage* srcImage=cvLoadImage("G:\\Image\\lena.png");   //加载一副图片double a=-1,b=255;                                      //注意:这里的参数a,b可以根据具体需要进行设置CvSize graySize;graySize.height=srcImage->height;graySize.width=srcImage->width;IplImage* grayImage=cvCreateImage(graySize,srcImage->depth,1);cvCvtColor(srcImage,grayImage,CV_RGB2GRAY);              //当数据类型一致时,它将图像从一个颜色空间(通道的数值)转换到另一个LinTran(grayImage,a,b);                                  //调用线性变换函数cvNamedWindow("原图");cvNamedWindow("变换结果");cvShowImage("原图",srcImage);cvShowImage("变换结果",grayImage);waitKey(0);return 0;}bool LinTran(IplImage *grayImage, double a,double b)       //线性变换函数的实现{if((grayImage->depth)!=8) return false;uchar gray;       //存储当前光标像素的灰度值int target;     //存储当前光标像素的目标值for(int h=0;h<grayImage->height;h++)                    //开始遍历grayImage灰度图像{for(int w=0;w<grayImage->width;w++){gray=(uchar)*((char*)(grayImage->imageData+h*grayImage->widthStep)+grayImage->nChannels*w); //取出当前坐标点的灰度值target=a*gray+b;if(target<0)  target=0;if(target>255)  target=255;*(char*)(grayImage->imageData+h*grayImage->widthStep+grayImage->nChannels*w) = target;      //将目标值写入目标图像}}return true;}

效果图片

0 0
原创粉丝点击