本章节我们来学习如何对图像进模糊操作。
一、图像模糊
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;
}