OpenCV-DoG

DoG(Difference of Gaussian) 常用于边缘检测、特征检测,是高斯函数的差分。我们已经知道可以通过将图像与高斯函数进行卷积得到一幅图像的低通滤波结果,即去噪过程,为一个正态分布函数,而某一尺度上的特征检测可以通过对两个相邻高斯尺度空间的图像相减,得到 DoG 的响应值图像

首先,高斯函数表示定义为:
Gσ1(x,y)=12πσ12exp⁡(−x2+y22σ12)G_{\sigma_{1}}(x, y)=\frac{1}{\sqrt{2 \pi \sigma_{1}^{2}}} \exp \left(-\frac{x^{2}+y^{2}}{2 \sigma_{1}^{2}}\right) Gσ1​​(x,y)=2πσ12​​1​exp(−2σ12​x2+y2​)其次,两幅图像的高斯滤波表示为:
g1(x,y)=Gσ1(x,y)∗f(x,y)g2(x,y)=Gσ2(x,y)∗f(x,y)\begin{array}{l} g_{1}(x, y)=G_{\sigma_{1}}(x, y) * f(x, y) \\ g_{2}(x, y)=G_{\sigma_{2}}(x, y) * f(x, y) \end{array} g1​(x,y)=Gσ1​​(x,y)∗f(x,y)g2​(x,y)=Gσ2​​(x,y)∗f(x,y)​最后,将上面滤波得到的两幅图像 g1g_1g1​ 与 g2g_2g2​ 相减得到:
g1(x,y)−g2(x,y)=Gσ1∗f(x,y)−Gσ2∗f(x,y)=(Gσ1−Gσ2)∗f(x,y)=DoG∗f(x,y)g_{1}(x, y)-g_{2}(x, y)=G_{\sigma_{1}} * f(x, y)-G_{\sigma_{2}} * f(x, y)=\left(G_{\sigma_{1}}-G_{\sigma_{2}}\right) * f(x, y)=D o G * f(x, y) g1​(x,y)−g2​(x,y)=Gσ1​​∗f(x,y)−Gσ2​​∗f(x,y)=(Gσ1​​−Gσ2​​)∗f(x,y)=DoG∗f(x,y)即,DoG 表达式为:
DoG≜Gσ1−Gσ2=12π(1σ1e−(x2+y2)/2σ12−1σ2e−(x2+y2)/2σ22)D o G \triangleq G_{\sigma_{1}}-G_{\sigma_{2}}=\frac{1}{\sqrt{2 \pi}}\left(\frac{1}{\sigma_{1}} e^{-\left(x^{2}+y^{2}\right) / 2 \sigma_{1}^{2}}-\frac{1}{\sigma_{2}} e^{-\left(x^{2}+y^{2}\right) / 2 \sigma_{2}^{2}}\right) DoG≜Gσ1​​−Gσ2​​=2π​1​(σ1​1​e−(x2+y2)/2σ12​−σ2​1​e−(x2+y2)/2σ22​)具体图像处理中,就是将两幅图像在不同参数下的高斯滤波结果相减,得到 DoG 图:

  1. 求出不同参数下的高斯滤波输出并求出其 DoG 图像,如下图所示:
    在 SIFT 的同一组中,每一层图像的尺寸都是一样的,但是平滑系数不一样。平滑系数分别为:0, σ\sigmaσ, kσk\sigmakσ, k2σk^2\sigmak2σ, … …

  1. 根据 DoG,求角点:三维图中的最大值和最小值的点是角点,如图所示:
    标记的红色为当前像素点,黄色的圈标记邻接像素点。用这个方式最多检测相邻尺度的 26 个像素点。如果它是所有邻接像素点的最大值或最小值点,则标记红色被标记为特征点,如此依次进行,则可以完成图像的特征点提取。

    我们可以计算出第一步中三个 DoG 图像中的极值点,如下图所示:
    黑色为极小值;白色为极大值。

    因此,原始图像上以显示的 DoG 角点检测结果,如下图所示:

OpenCV 代码帮助理解:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;int main(int argc, char** argv) {Mat src, dst;src = imread("2.jpg");if (!src.data) {printf("could not load image...\n");return -1;}//创建显示窗口char INPUT_WIN[] = "input image";char OUTPUT_WIN[] = "result image";namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);imshow(INPUT_WIN, src);//上采样/*pyrUp(src, dst, Size(src.cols*2, src.rows*2));imshow(OUTPUT_WIN, dst);*///降采样Mat s_down;pyrDown(src,s_down, Size(src.cols/2, src.rows/2));imshow("sample_down", s_down);//DOG----高斯不同Mat gray_src, g1, g2, dogImg;cvtColor(s_down, gray_src, CV_BGR2GRAY);//两次高斯模糊GaussianBlur(gray_src, g1, Size(3,3), 0.6, 0);GaussianBlur(gray_src, g2, Size(3,3), 1.2, 0);subtract(g1, g2, dogImg, Mat());   //差分图的灰度值比较小,图比较暗。//归一化显示normalize(dogImg, dogImg, 255, 0, NORM_MINMAX);  //归一化,放到0-255显示。imshow("DOG_img", dogImg);waitKey(0);return 0;
}

OpenCV-DoG相关推荐

  1. OpenCV(22)SIFT尺度不变特征变换(纯理论)

    SIFT算法(纯理论) 1.引言 前面介绍了Harris和Shi-Tomasi角点检测算法,这两种算法具有旋转不变性,但不具有尺度不变性.以下图为例,在左侧小图中可以检测到角点,但是图像被放大后,在使 ...

  2. Python+OpenCV:尺度不变特征变换 (SIFT, Scale-Invariant Feature Transform)

    Python+OpenCV:尺度不变特征变换 (SIFT, Scale-Invariant Feature Transform) 理论 A corner in a small image within ...

  3. OpenCV系列之SIFT尺度不变特征变换 | 三十九

    目标 在这一章当中, 我们将学习SIFT算法的概念 我们将学习找到SIFT关键点和描述算符. 理论 在前两章中,我们看到了一些像Harris这样的拐角检测器.它们是旋转不变的,这意味着即使图像旋转了, ...

  4. python-opencv图像处理之SIFT尺度不变特征变换

    在这一章当中,我们将学习SIFT算法的概念,找到SIFT关键点和描述算符. 一.概念 在前面,我们看到了一些像Harris这样的拐角检测器.它们是旋转不变的,这意味着即使图像旋转了,我们也可以找到相同 ...

  5. 一文读懂SIFT算法(英文版)

    文章目录 说在前面的话: Scale Invariant Feature Transform (SIFT) Detector and Descriptor Goal 0. Theory Laplaci ...

  6. Python 迁移学习实用指南:1~5

    原文:Hands-On Transfer Learning with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学习 译文集],采用译后编辑(MT ...

  7. opencv 的norm_OpenCV学习笔记(一)之图像金字塔-上采样与降采样与DOG

    一. 图像金字塔 一个图像金字塔式一系列的图像组成,最底下的图形尺寸最大,最上方的图像尺寸最小. 高斯金字塔是从底向上,逐层降采样得到的. 高斯金字塔的生成过程分为两步: 1. 对当前层进行高斯模糊. ...

  8. 【youcans 的 OpenCV 例程200篇】153. 边缘检测之 DoG 算子

    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程20 ...

  9. OpenCV —— 边缘检测(Laplacian、LoG、DoG、Marr-Hildreth 边缘检测)

    边缘检测 Laplacian 算子 高斯拉普拉斯(LoG)边缘检测 高斯差分(DoG)边缘检测 Marr-Hildreth 边缘检测 Laplacian 算子 二维函数 f(x,y)f(x,y)f(x ...

  10. OpenCV 笔记(02)— 图像显示、保存、腐蚀、模糊、canny 边缘检测(imread、imshow、namedWindow、imwrite)

    OpenCV 提供两种用户界面选项: 基于原生用户界面的基本界面,适用于 Mac OS X 的 cocoa 或 carbon,以及适用于 Linux 或 Windows 用户界面的 GTK ,这些界面 ...

最新文章

  1. shell脚本求和_【零基础学云计算】Shell编程之case语句与循环语句
  2. 数值格式化,每隔三位加一个逗号
  3. java 正则匹配 sql星号,18. 正则表达式:开头、结尾、任意一个字符、星号和加号匹配...
  4. 【BZOJ5335】【TJOI2018】—智力竞赛(floyd传递闭包+二分图匹配)
  5. android 数字证书具体应用机制
  6. OpenStack精华问答 | OpenStack的网络类型有哪些?
  7. Unity3d UGUI 通用Confirm确认对话框实现(Inventory Pro学习总结)
  8. 【TSP】基于matlab遗传算法求解中国35省会城市旅行商问题【含Matlab源码 1222期】
  9. java 全量_七、通过java代码实现增量、全量索引
  10. mbp touchbar设置_Macbook Pro 上 有什么好的 Touchbar 使用技巧?
  11. Flume安装部署,采集方案配置文件编写案例,启动agent采集数据
  12. 【学神】1-15 linux启动及常见故障的排除
  13. 你可和差拨便去那里 视频转换软件
  14. 新款云开发趣味测试小程序源码+功能超多
  15. 阿里巴巴内推一面过程
  16. 老铁们来来来,实战STM32
  17. 快速傅里叶变换(研二的我终于弄懂了)
  18. 项目笔记一-----------------iphone官网仿制
  19. 再谈解决“因为文件包含病毒或潜在的垃圾软件”系统找不到gpedit.msc
  20. pdf.net sod oracle,SOD: 原PDF.NET框架将成为一个全功能的企业开发框架,而 SOD框架将是PDF.NET开发框架下面的 “数据开发框架...

热门文章

  1. 华为认证hcia含金量_华为认证那个证书有什么用?
  2. html5 360全景 陀螺仪,HTML网页设置(开启重力感应/陀螺仪)
  3. SparkOutOfMemoryError: Unable to acquire 65536 bytes of memory, got 0
  4. 招银网络科技--后端面试记录
  5. SRRC认证问题合集
  6. Java 标准输入输出流(System.in,System.out)使用
  7. 十种常见领带的打法图解
  8. 【python】2行代码实现gif动图压缩(pygifsicle)
  9. python 转换数字为中文的大写
  10. keil调试中黄色三角形代表什么意思