OpenCV-C++-CUDA-02-图像基本操作之像素操作, test ok

本章继续学习CUDA下的OpenCV学习,主要是学习CUDA下图像的像素变换。

一、图像之间的加减乘除

(1) 图像相加
主要API:

cuda::add(input image1, input image2, output image)

需要相加的两张图片:
在这里插入图片描述在这里插入图片描述
相关代码:

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;


int main(int argc, char **argv)
{
	Mat src1 = imread("D:/opencv/opencv_4.1.2/sources/samples/data/WindowsLogo.jpg");
	Mat src2 = imread("D:/opencv/opencv_4.1.2/sources/samples/data/LinuxLogo.jpg");
	imshow("input1", src1);
	imshow("input2", src2);
	
	//GPU操作
	cuda::GpuMat g_src1, g_src2,dst;
	g_src1.upload(src1);
	g_src2.upload(src2);
	cuda::add(g_src1, g_src2, dst);//图像相加,每个通道的值分别相加(像素值超过255会等于255)

	Mat result;
	dst.download(result);
	imshow("reslut", result);

	waitKey(0);
	return 0;
}

    结果:
    在这里插入图片描述
    (2)图像相减

    cuda::subtract(input image1, input image2, output image);

    #include<opencv2/opencv.hpp>
    #include<iostream>
    
    using namespace cv;
    using namespace std;
    
    
    int main(int argc, char **argv)
    {
    	Mat src1 = imread("D:/opencv/opencv_4.1.2/sources/samples/data/WindowsLogo.jpg");
    	Mat src2 = imread("D:/opencv/opencv_4.1.2/sources/samples/data/LinuxLogo.jpg");
    	imshow("input1", src1);
    	imshow("input2", src2);
    	
    	//GPU操作
    	cuda::GpuMat g_src1, g_src2,dst;
    	g_src1.upload(src1);
    	g_src2.upload(src2);
    	//cuda::add(g_src1, g_src2, dst);//图像相加,每个通道的值分别相加(像素值超过255会等于255)
    	cuda::subtract(g_src1, g_src2, dst);//图像相减
    	Mat result;
    	dst.download(result);
    	imshow("reslut", result);
    
    	waitKey(0);
    	return 0;
    }
    

      结果:
      在这里插入图片描述
      (3)图像相乘

      cuda::multiply(input image1, input image2, output image);

      #include<opencv2/opencv.hpp>
      #include<iostream>
      
      using namespace cv;
      using namespace std;
      
      
      int main(int argc, char **argv)
      {
      	Mat src1 = imread("D:/opencv/opencv_4.1.2/sources/samples/data/WindowsLogo.jpg");
      	Mat src2 = imread("D:/opencv/opencv_4.1.2/sources/samples/data/LinuxLogo.jpg");
      	imshow("input1", src1);
      	imshow("input2", src2);
      	
      	//GPU操作
      	cuda::GpuMat g_src1, g_src2,dst;
      	g_src1.upload(src1);
      	g_src2.upload(src2);
      	//cuda::add(g_src1, g_src2, dst);//图像相加,每个通道的值分别相加(像素值超过255会等于255)
      	//cuda::subtract(g_src1, g_src2, dst);//图像相减
      	cuda::multiply(g_src1, g_src2, dst);//图像相乘
      	
      	Mat result;
      	dst.download(result);
      	imshow("reslut", result);
      
      	waitKey(0);
      	return 0;
      }
      

        结果:
        在这里插入图片描述

        cuda::divide(input image1, input image2, output image)

        #include<opencv2/opencv.hpp>
        #include<iostream>
        
        using namespace cv;
        using namespace std;
        
        
        int main(int argc, char **argv)
        {
        	Mat src1 = imread("D:/opencv/opencv_4.1.2/sources/samples/data/WindowsLogo.jpg");
        	Mat src2 = imread("D:/opencv/opencv_4.1.2/sources/samples/data/LinuxLogo.jpg");
        	imshow("input1", src1);
        	imshow("input2", src2);
        	
        	//GPU操作
        	cuda::GpuMat g_src1, g_src2,dst;
        	g_src1.upload(src1);
        	g_src2.upload(src2);
        	//cuda::add(g_src1, g_src2, dst);//图像相加,每个通道的值分别相加(像素值超过255会等于255)
        	//cuda::subtract(g_src1, g_src2, dst);//图像相减
        	//cuda::multiply(g_src1, g_src2, dst);//图像相乘
        	cuda::divide(g_src1, g_src2, dst);//图像相除
        	
        	Mat result;
        	dst.download(result);
        	imshow("reslut", result);
        
        	waitKey(0);
        	return 0;
        }
        

          结果:
          在这里插入图片描述

          二、图像权重加减(明亮度变化)

          cuda::addWeighted()

          Mat image_host = imread("D:/opencv/opencv_4.1.2/sources/samples/data/smarties.png");
          	cuda::GpuMat image,add_image;
          	Mat add_result;
          	image.upload(image_host);//读到GPU中
          	cuda::GpuMat black=cuda::GpuMat(image.size(), image.type());
          	//cuda::addWeighted(image, 0.5, black, 0.6, 0, add_image);//权重加减,变暗
          	cuda::addWeighted(image, 0.5, black, 0.6, 200, add_image);//权重加减,变亮
          	add_image.download(add_result);
          	imshow("add image", add_result);
          	imshow("image host", image_host);
          	waitKey(0);
          	return 0;
          

            运行结果:
            变暗:
            在这里插入图片描述
            变亮:
            在这里插入图片描述
                    可以看到,图像的亮度发生了变化,使用这个操作可以应用在深度学习领域中的图像增强部分。不仅如此,我们还可以加上取反的操作:

            cuda::bitwise_not(add_image, add_image);//取反
            

              结果:
              在这里插入图片描述

              三、色彩空间转换

              cuda::GpuMat hsv, rgb, gray, YCrCb;
              	cuda::cvtColor(image, hsv, COLOR_BGR2HSV);
              	cuda::cvtColor(image, rgb, COLOR_BGR2RGB);
              	cuda::cvtColor(image, gray,COLOR_BGR2GRAY);
              	cuda::cvtColor(image, YCrCb, COLOR_BGR2YCrCb);
              	cv::Mat hsv_host, rgb_host, gray_host, YCrCb_host;
              	hsv.download(hsv_host);
              	rgb.download(rgb_host);
              	gray.download(gray_host);
              	YCrCb.download(YCrCb_host);
              	imshow("hsv", hsv_host);
              	imshow("rgb", rgb_host);
              	imshow("gray", gray_host);
              	imshow("YCrCb", YCrCb_host);
              	waitKey(0);
              

                结果:
                在这里插入图片描述在这里插入图片描述
                        好了,暂时到这里,其实,由于upload和download的原因,对于单张图片来说,它的响应速度不是很快,但是,在视频中的话,它一定是可以取到不错的效果的,这里我用到了很对upload和download,所以,响应会长一点。

                下面是所有源码:

                #include<opencv2/opencv.hpp>
                #include<iostream>
                
                using namespace cv;
                using namespace std;
                
                
                int main(int argc, char **argv)
                {
                	Mat src1 = imread("D:/opencv/opencv_4.1.2/sources/samples/data/WindowsLogo.jpg");
                	Mat src2 = imread("D:/opencv/opencv_4.1.2/sources/samples/data/LinuxLogo.jpg");
                	imshow("input1", src1);
                	imshow("input2", src2);
                	
                	//GPU操作
                	/*----加减乘除----*/
                	cuda::GpuMat g_src1, g_src2,dst;
                	g_src1.upload(src1);
                	g_src2.upload(src2);
                	cuda::add(g_src1, g_src2, dst);//图像相加,每个通道的值分别相加(像素值超过255会等于255)
                	//cuda::subtract(g_src1, g_src2, dst);//图像相减
                	//cuda::multiply(g_src1, g_src2, dst);//图像相乘
                	//cuda::divide(g_src1, g_src2, dst);//图像相除
                
                
                	Mat result;
                	dst.download(result);
                	imshow("reslut", result);
                
                	/*-----权重加减-----*/
                	Mat image_host = imread("D:/opencv/opencv_4.1.2/sources/samples/data/smarties.png");
                	cuda::GpuMat image,add_image;
                	Mat add_result;
                	image.upload(image_host);//读到GPU中
                	cuda::GpuMat black=cuda::GpuMat(image.size(), image.type());
                	//cuda::addWeighted(image, 0.5, black, 0.6, 0, add_image);//权重加减,变暗
                	cuda::addWeighted(image, 0.5, black, 0.6, 200, add_image);//权重加减,变亮
                	//cuda::bitwise_not(add_image, add_image);//取反
                	add_image.download(add_result);
                	
                	imshow("add image", add_result);
                	imshow("image host", image_host);
                	/*-----色彩空间转换------*/
                	cuda::GpuMat hsv, rgb, gray, YCrCb;
                	cuda::cvtColor(image, hsv, COLOR_BGR2HSV);
                	cuda::cvtColor(image, rgb, COLOR_BGR2RGB);
                	cuda::cvtColor(image, gray,COLOR_BGR2GRAY);
                	cuda::cvtColor(image, YCrCb, COLOR_BGR2YCrCb);
                	cv::Mat hsv_host, rgb_host, gray_host, YCrCb_host;
                	hsv.download(hsv_host);
                	rgb.download(rgb_host);
                	gray.download(gray_host);
                	YCrCb.download(YCrCb_host);
                	imshow("hsv", hsv_host);
                	imshow("rgb", rgb_host);
                	imshow("gray", gray_host);
                	imshow("YCrCb", YCrCb_host);
                	waitKey(0);
                	return 0;
                }
                
                  评论
                  添加红包

                  请填写红包祝福语或标题

                  红包个数最小为10个

                  红包金额最低5元

                  当前余额3.43前往充值 >
                  需支付:10.00
                  成就一亿技术人!
                  领取后你会自动成为博主和红包主的粉丝 规则
                  hope_wisdom
                  发出的红包

                  打赏作者

                  小硕算法工程师

                  你的鼓励将是我创作的最大动力哈

                  ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
                  扫码支付:¥1
                  获取中
                  扫码支付

                  您的余额不足,请更换扫码支付或充值

                  打赏作者

                  实付
                  使用余额支付
                  点击重新获取
                  扫码支付
                  钱包余额 0

                  抵扣说明:

                  1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
                  2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

                  余额充值