自学内容网 自学内容网

8.12DoG (Difference of Gaussians)

基本概念

不同尺度的高斯模糊图像之间的差异(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图像,例如阈值化或非极大值抑制等操作,以更好地突出边缘或特征。


原文地址:https://blog.csdn.net/weixin_45794330/article/details/142002797

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!