• 学习OpenCV(四) 改变图像的对比度和亮度——像素变换


    在上篇文章中,我们介绍了如何用filter2D函数来对图像进行邻域变换。这篇文章我们来简单介绍一下如何对图像的像素进行变换。

    对图像的单个像素进行变换,是图像处理中一个很常见的操作。比如改变图像的亮度,对图像像素进行线性变换,二值化等。下面将以改变图像的对比度和亮度来举例。

    改变图像的对比度和亮度,归根到底,就是下面的这个数学公式:

    这个式子很好理解。就是将原来图像中的像素值进行比例变换,后又进行了移动。alpha一般叫做增益参数,表征对比度,而beta成为偏置参数,表征亮度变化。

    对图像的每个像素进行操作,其实我们在前面的文章中已经介绍过了,比如LUT查表操作,直接用指针访问,或是用迭代器等。下面的这段代码实现了对图像对比度和亮度的这一操作,我们用指针实现:

    #include <iostream>
    #include <opencv2/core/core.hpp>
    #include <opencv/cv.hpp>
    #include <opencv2/highgui/highgui.hpp>
    
    using namespace std;
    using namespace cv;
    
    Mat ChangePixel(const Mat& img,const double alpha,const int beta)
    {
    	Mat newImg=Mat::zeros(img.size(),img.type ());    // the img to be returned
    	int chnnels=img.channels ();            //Get the channels of source img
    	for (int x=0;x<img.rows;x++)             //iteration rows
    	{
    		//用指针访问
    		const uchar *p=img.ptr <uchar>(x);    //由于img被声明为const,所以指针也要声明为const
    		uchar *q=newImg.ptr <uchar>(x);
    		int cols=img.cols*chnnels;
    		for (int y=0;y<cols;y++)
    		{
    			q[y]=saturate_cast<uchar>(p[y]*alpha+beta);  //注意saturate_cast的使用
    		}
    		
    	}
    	return newImg;
    }
    
    int main()
    {
    	int64 time_start=getTickCount ();
    	Mat A=imread ("lena.jpg",CV_LOAD_IMAGE_COLOR);
    	imshow ("A的图像",A);
    
    	Mat B=ChangePixel (A,2,0);
    	imshow ("B的图像",B);
    	int64 time_end=getTickCount ();
    	double time_take=(time_end-time_start)*1000.0/getTickFrequency ();
    	cout<<"The time is "<<time_take<<"ms"<<endl;
    	waitKey ();
    	return 0;
    }

    注意代码中saturate_cast函数的使用。这个函数用来完成一个类型到另一个类型的转换(当然,这种类型的转换必须是被允许的)。而如果被转换的值超过了目的类型的界限时,该函数会自动返回界限值。

    比如:


    这样,我们就实现了对图像对比度和亮度的变换操作:


    不过,OpenCV中已经有了进行这样处理的函数:Mat::convertTo,它可以完成图像的数据类型转换,同时,对像素值进行改变。

    如果参数中的rType为负数,则转换前后图像的类型不变,所以,我们可以用一行代码实现我们原来的操作:

    A.convertTo (B,-1,2,0);

    而且,在我的电脑上通过试验,通过这种方法进行操作,所花时间也变少了。

  • 相关阅读:
    多种方式安装GitLabRunner
    rpm,docker,k8s三种方式安装部署GitLab服务
    利用curl命令访问Kubernetes API server
    在客户端电脑使用 kubectl 远程管理 Kubernetes
    利用 Nginx 反向代理搭建本地 yum 服务器
    Jenkins和Gitlab CI/CD自动更新k8s中pod使用的镜像说明
    1.在 Kubernetes 在快速安装 Harbor
    4.Gitlab CI 与 Kubernetes 的结合
    3.在 Kubernetes 上安装 Gitlab CI Runner
    2. 在 Kubernetes 上安装 Gitlab
  • 原文地址:https://www.cnblogs.com/xmfbit/p/3872188.html
Copyright © 2020-2023  润新知