基本概念
不同尺度的高斯模糊图像之间的差异(DoG),用于边缘检测。函数: cv::GaussianBlur() 结合 cv::Laplacian() 或者自定义DoG实现。
在OpenCV中并没有直接提供一个名为“DoG”(Difference of Gaussians)的函数,但是你可以通过组合使用高斯模糊(Gaussian Blur)来实现DoG的效果。DoG技术通常用于边缘检测和特征检测,如SIFT(Scale-Invariant Feature Transform)特征提取算法中。
DoG的基本思想是在不同的尺度上对图像应用高斯模糊,然后计算两个不同尺度的高斯模糊图像之间的差异。这个差异图像是在某个尺度上图像边缘的良好近似。
实现步骤
应用高斯模糊:对输入图像应用两次高斯模糊,每次使用不同的核大小(不同的σ值)。
计算差异:从两个高斯模糊图像中减去较小σ值对应的图像得到差异图像。
函数原型
虽然没有直接的DoG函数,但我们可以通过调用cv::GaussianBlur函数来实现所需的效果:
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT);
使用示例
下面是一个使用C++和OpenCV实现DoG效果的示例代码:
#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
// 读取图像文件
cv::Mat img = cv::imread("874.png", cv::IMREAD_GRAYSCALE);
if (img.empty())
{
std::cout << "Error: Image not found or unable to read the image." << std::endl;
return -1;
}
// 定义高斯核大小和σ值
int kernel_size1 = 3; // 第一个高斯模糊核大小
int kernel_size2 = 5; // 第二个高斯模糊核大小
double sigma1 = 0.0; // σ值可以设为0让OpenCV自动计算
double sigma2 = 0.0; // σ值可以设为0让OpenCV自动计算
// 创建输出图像
cv::Mat img_gauss1, img_gauss2, dog;
// 对图像应用高斯模糊
cv::GaussianBlur(img, img_gauss1, cv::Size(kernel_size1, kernel_size1), sigma1);
cv::GaussianBlur(img, img_gauss2, cv::Size(kernel_size2, kernel_size2), sigma2);
// 计算DoG
cv::absdiff(img_gauss2, img_gauss1, dog); // 计算差异并取绝对值
// 显示原图和DoG图像
cv::namedWindow("Original Image", cv::WINDOW_NORMAL);
cv::imshow("Original Image", img);
cv::namedWindow("DoG Image", cv::WINDOW_NORMAL);
cv::imshow("DoG Image", dog);
// 等待用户按键后退出
cv::waitKey(0);
return 0;
}
说明
读取图像:首先读取一张灰度图像。
定义核大小和σ值:定义两个不同的高斯核大小,通常较大的核对应较大的σ值。
应用高斯模糊:使用cv::GaussianBlur函数分别对图像应用两个不同大小的高斯模糊。
计算差异:使用cv::absdiff函数计算两个模糊图像之间的差异。cv::absdiff函数计算两个图像的元素差,并返回绝对值。
显示结果:显示原始图像和DoG图像。
说明
读取图像:首先读取一张灰度图像。
定义核大小和σ值:定义两个不同的高斯核大小,通常较大的核对应较大的σ值。
应用高斯模糊:使用cv::GaussianBlur函数分别对图像应用两个不同大小的高斯模糊。
计算差异:使用cv::absdiff函数计算两个模糊图像之间的差异。cv::absdiff函数计算两个图像的元素差,并返回绝对值。
显示结果:显示原始图像和DoG图像。
运行结果
这个简单的例子展示了如何在OpenCV中通过组合不同的函数来实现DoG效果。你可以根据需要调整高斯核大小和σ值来获得不同的效果。在实际应用中,可能还需要进一步处理DoG图像,例如阈值化或非极大值抑制等操作,以更好地突出边缘或特征。