OpenCV-C++-CUDA-04-图像模糊和Sobel梯度

        本章节我们来学习如何对图像进模糊操作。

一、图像模糊

1)普通模糊

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

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat input_image = imread("F:/test/lena.jpg");
	cuda::GpuMat image(input_image);
	cuda::cvtColor(image, image, COLOR_BGR2BGRA);//createBoxFilter支持单通道或4通道图像
	
	// 创建不同的box filter
	cuda::GpuMat result_3X3, result_5X5, result_7X7;
	auto filter_3X3 = cuda::createBoxFilter(image.type(), image.type(), Size(3, 3), Point(-1, -1));
	auto filter_5X5 = cuda::createBoxFilter(image.type(), image.type(), Size(5, 5), Point(-1, -1));
	auto filter_7X7 = cuda::createBoxFilter(image.type(), image.type(), Size(7, 7), Point(-1, -1));
	filter_3X3->apply(image, result_3X3);
	filter_5X5->apply(image, result_5X5);
	filter_7X7->apply(image, result_7X7);
	Mat result3X3, result5X5,result7X7;
	//下载数据
	result_3X3.download(result3X3);
	result_5X5.download(result5X5);
	result_7X7.download(result7X7);
	imshow("input image", input_image);
	imshow("result 3X3", result3X3);
	imshow("result 5X5", result5X5);
	imshow("result 7X7", result7X7);
	waitKey(0);
	
	return 0;
}

原图:
在这里插入图片描述

结果:
在这里插入图片描述
2)高斯模糊

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

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat input_image = imread("F:/test/lena.jpg");
	cuda::GpuMat image(input_image);
	cuda::cvtColor(image, image, COLOR_BGR2BGRA);//createBoxFilter支持单通道或4通道图像
	
	// 创建不同的box filter
	cuda::GpuMat result_3X3, result_5X5, result_7X7;
	
	//高斯 filter
	auto Gaufilter_3X3 = cuda::createGaussianFilter(image.type(), image.type(), Size(3, 3), 3);
	auto Gaufilter_5X5 = cuda::createGaussianFilter(image.type(), image.type(), Size(5, 5), 5);
	auto Gaufilter_7X7 = cuda::createGaussianFilter(image.type(), image.type(), Size(7, 7), 7);
	
	Gaufilter_3X3->apply(image, result_3X3);
	Gaufilter_5X5->apply(image, result_5X5);
	Gaufilter_7X7->apply(image, result_7X7);

	Mat result3X3, result5X5,result7X7;
	//下载数据
	result_3X3.download(result3X3);
	result_5X5.download(result5X5);
	result_7X7.download(result7X7);
	imshow("input image", input_image);
	imshow("result 3X3", result3X3);
	imshow("result 5X5", result5X5);
	imshow("result 7X7", result7X7);
	
	
	waitKey(0);
	
	return 0;
}

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

二、Sobel梯度

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

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat input_image = imread("F:/test/lena.jpg");
	cuda::GpuMat image(input_image);
	cuda::cvtColor(image, image, COLOR_BGR2BGRA);//createBoxFilter支持单通道或4通道图像
	//图像梯度
	auto sobel_dx = cuda::createSobelFilter(image.type(), image.type(), 1, 0, 3);
	auto sobel_dy = cuda::createSobelFilter(image.type(), image.type(), 0, 1, 3);
	cuda::GpuMat grad_x, grad_y,grad_xy;
	sobel_dx->apply(image, grad_x);
	sobel_dy->apply(image, grad_y);
	cuda::addWeighted(grad_x, 0.5, grad_y, 0.5, 0, grad_xy);
	Mat grad_host;
	grad_xy.download(grad_host);


	imshow("input image", input_image);
	imshow("grad result", grad_host);
	
	
	waitKey(0);
	
	return 0;
}

结果:
在这里插入图片描述
本章节源码:

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

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat input_image = imread("F:/test/lena.jpg");
	cuda::GpuMat image(input_image);
	cuda::cvtColor(image, image, COLOR_BGR2BGRA);//createBoxFilter支持单通道或4通道图像
	
	// 创建不同的box filter
	cuda::GpuMat result_3X3, result_5X5, result_7X7;
	/*auto filter_3X3 = cuda::createBoxFilter(image.type(), image.type(), Size(3, 3), Point(-1, -1));
	auto filter_5X5 = cuda::createBoxFilter(image.type(), image.type(), Size(5, 5), Point(-1, -1));
	auto filter_7X7 = cuda::createBoxFilter(image.type(), image.type(), Size(7, 7), Point(-1, -1));*/
	//高斯 filter
	auto Gaufilter_3X3 = cuda::createGaussianFilter(image.type(), image.type(), Size(3, 3), 3);
	auto Gaufilter_5X5 = cuda::createGaussianFilter(image.type(), image.type(), Size(5, 5), 5);
	auto Gaufilter_7X7 = cuda::createGaussianFilter(image.type(), image.type(), Size(7, 7), 7);
	
	/*filter_3X3->apply(image, result_3X3);
	filter_5X5->apply(image, result_5X5);
	filter_7X7->apply(image, result_7X7);*/
	Gaufilter_3X3->apply(image, result_3X3);
	Gaufilter_5X5->apply(image, result_5X5);
	Gaufilter_7X7->apply(image, result_7X7);

	//图像梯度
	auto sobel_dx = cuda::createSobelFilter(image.type(), image.type(), 1, 0, 3);
	auto sobel_dy = cuda::createSobelFilter(image.type(), image.type(), 0, 1, 3);
	cuda::GpuMat grad_x, grad_y,grad_xy;
	sobel_dx->apply(image, grad_x);
	sobel_dy->apply(image, grad_y);
	cuda::addWeighted(grad_x, 0.5, grad_y, 0.5, 0, grad_xy);
	Mat grad_host;
	grad_xy.download(grad_host);

	Mat result3X3, result5X5,result7X7;
	//下载数据
	result_3X3.download(result3X3);
	result_5X5.download(result5X5);
	result_7X7.download(result7X7);
	imshow("input image", input_image);
	imshow("result 3X3", result3X3);
	imshow("result 5X5", result5X5);
	imshow("result 7X7", result7X7);
	imshow("grad result", grad_host);
	
	
	waitKey(0);
	
	return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值