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图像,例如阈值化或非极大值抑制等操作,以更好地突出边缘或特征。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值