OpenCV学习问题记录(三)

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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值