1、高斯滤波
关于高斯滤波相关介绍
代码实现(调用OpenCV库)
#include <iostream>
#include <numeric>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
void gaussianSmoothing1()
{
// load image from file
cv::Mat img;
img = cv::imread("E:/传感器融合/SensorFusion/所有代码/所有代码/3_Camera/04_Tracking Image Features/gradient_filtering/images/img1gray.png");
// create filter kernel
float gauss_data[25] = { 1, 4, 7, 4, 1,
4, 16, 26, 16, 4,
7, 26, 41, 26, 7,
4, 16, 26, 16, 4,
1, 4, 7, 4, 1 };
cv::Mat kernel = cv::Mat(5, 5, CV_32F, gauss_data);
// STUDENTS NEET TO ENTER THIS CODE
for (int i = 0; i < 25; i++)
{
gauss_data[i] /= 273;//低通滤波器要注意卷积核除以相应系数
}
// EOF STUDENT CODE
// apply filter
cv::Mat result;
cv::filter2D(img, result, -1, kernel, cv::Point(-1, -1), 0, cv::BORDER_DEFAULT);
// show result
string windowName = "Gaussian Blurring";
cv::namedWindow(windowName, 1); // create window
cv::imshow(windowName, result);
cv::waitKey(0); // wait for keyboard input before continuing
}
int main()
{
gaussianSmoothing1();
}
注解:函数cv::filter2D(img, result, -1, kernel, cv::Point(-1, -1), 0, cv::BORDER_DEFAULT);其主要作用就是进行矩阵间的卷积运算。
基本形式:
void filter2D( InputArray src, OutputArray dst, int ddepth,InputArray kernel, Point anchor=Point(-1,-1),double delta=0, int borderType=BORDER_DEFAULT );
含义:
其中src为输入图像.dst为输出图像.kernel为卷积核, 单通道浮点矩阵. anchor核的锚点表示一个被滤波的点在核内的位置。
ddepth: 目标图像深度,-1代表与输入图像保持相同深度
InputArray kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵。如果想在图像不同的通道使用不同的kernel,可以先使用split()函数将图像通道事先分开。
Point anchor: 内核的基准点(anchor),其默认值为(-1,-1)说明位于kernel的中心位置。基准点即kernel中与进行处理的像素点重合的点。
double delta: 在储存目标图像前可选的添加到像素的值,默认值为0
int borderType: 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。
部分内容参考
高斯核的数值及窗口大小确定:
高斯滤波(平滑),即用某一尺寸的二维高斯核与图像进行卷积。高斯核是对连续高斯函数的离散近似,通常对高斯曲面进行离散采样和归一化得出,这里,归一化指的是卷积核所有元素之和为1。
相关内容参考
2、sobel算子计算对比度梯度
sobel算子卷积核
图像是经过灰度化和滤波的
#include <iostream>
#include <numeric>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
void gradientSobel()
{
// load image from file
cv::Mat img;
img = cv::imread("E:/传感器融合/SensorFusion/所有代码/所有代码/3_Camera/04_Tracking Image Features/gradient_filtering/images/img1.png");
// convert image to grayscale
cv::Mat imgGray;
cv::cvtColor(img, imgGray, cv::COLOR_BGR2GRAY);
// create filter kernel
float sobel_x[9] = { -1, 0, +1,
-2, 0, +2,
-1, 0, +1 };
cv::Mat kernel_x = cv::Mat(3, 3, CV_32F, sobel_x);
// apply filter
cv::Mat result_x;
cv::filter2D(imgGray, result_x, -1, kernel_x, cv::Point(-1, -1), 0, cv::BORDER_DEFAULT);
// show result
string windowName = "Sobel operator (x-direction)";
cv::namedWindow(windowName, 1); // create window
cv::imshow(windowName, result_x);
cv::waitKey(0);
}
int main()
{
gradientSobel();
}
3、整体步骤算法
#include <iostream>
#include <numeric>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
void magnitudeSobel()
{
// load image from file
cv::Mat img;
img = cv::imread("../images/img1gray.png");
// convert image to grayscale
cv::Mat imgGray;
cv::cvtColor(img, imgGray, cv::COLOR_BGR2GRAY);
// apply smoothing
cv::Mat blurred = imgGray.clone();
int filterSize = 5;
int stdDev = 2.0;
cv::GaussianBlur(imgGray, blurred, cv::Size(filterSize, filterSize), stdDev);
// create filter kernels
float sobel_x[9] = {-1, 0, +1, -2, 0, +2, -1, 0, +1};
cv::Mat kernel_x = cv::Mat(3, 3, CV_32F, sobel_x);
float sobel_y[9] = {-1, -2, -1, 0, 0, 0, +1, +2, +1};
cv::Mat kernel_y = cv::Mat(3, 3, CV_32F, sobel_y);
// apply filter
cv::Mat result_x, result_y;
cv::filter2D(blurred, result_x, -1, kernel_x, cv::Point(-1, -1), 0, cv::BORDER_DEFAULT);
cv::filter2D(blurred, result_y, -1, kernel_y, cv::Point(-1, -1), 0, cv::BORDER_DEFAULT);
// compute magnitude image
cv::Mat magnitude = imgGray.clone();
for (int r = 0; r < magnitude.rows; r++)
{
for (int c = 0; c < magnitude.cols; c++)
{
magnitude.at<unsigned char>(r, c) = sqrt(pow(result_x.at<unsigned char>(r, c), 2) +
pow(result_y.at<unsigned char>(r, c), 2));//将分别在x,y方向计算对比度强度的结果图进行融合。
}
}
// show result
string windowName = "Gaussian Blurring";
cv::namedWindow(windowName, 1); // create window
cv::imshow(windowName, magnitude);
cv::waitKey(0); // wait for keyboard input before continuing
}
int main()
{
magnitudeSobel();
}