图像处理中的 Gaussina Blur 和 SIFT 算法

Gaussina Blur 高斯模糊

高斯模糊的数学定义

高斯模糊是通过 高斯核(Gaussian Kernel) 对图像进行卷积操作实现的. 二维高斯函数定义为
G ( x , y , σ ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x, y, \sigma) = \frac{1}{2\pi \sigma^2} e^{-\frac{x^2 + y^2}{2\sigma^2}} G(x,y,σ)=2πσ21e2σ2x2+y2
其中:

  • ( x , y ) (x, y) (x,y) 是像素点的坐标
  • σ \sigma σ 是高斯核的标准差, 控制模糊程度 σ \sigma σ 越大, 图像越模糊

高斯模糊计算的 Python 实现

以下是使用 OpenCV 计算不同尺度高斯模糊的代码

import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
img = cv2.imread('00001.jpg', cv2.IMREAD_COLOR_RGB)# 定义高斯核的尺度(σ值)
sigma_values = [1.0, 1.6, 2.0, 2.5, 3.0]  # 示例σ值# 对每个σ值进行高斯模糊
blurred_images = []
for sigma in sigma_values:# 高斯核大小(通常根据σ自动计算,如 ksize=(0,0))blurred = cv2.GaussianBlur(img, (0, 0), sigmaX=sigma, sigmaY=sigma)blurred_images.append(blurred)# 显示结果
plt.figure(figsize=(15, 8))
# 原图
plt.subplot(2, 3, 1)
plt.imshow(img)
plt.title('original')
plt.axis('off')
# 模糊处理过的图
for i, (sigma, blurred) in enumerate(zip(sigma_values, blurred_images)):plt.subplot(2, 3, i+2)plt.imshow(blurred, cmap='gray')plt.title(f'σ={sigma}')plt.axis('off')
plt.tight_layout()
plt.show()
  • cv2.GaussianBlur(img, ksize, sigmaX)
    • ksize=(0,0) 时, OpenCV 会根据 σ \sigma σ 自动计算核大小, 通常为 6 σ + 1 6\sigma + 1 6σ+1
    • sigmaXsigmaY 是高斯核在 X 和 Y 方向的标准差, 通常设为相同值

高斯核矩阵

在实际计算中, 高斯核需要离散化为一个二维矩阵. 例如, 当 σ = 1.0 \sigma = 1.0 σ=1.0 时, 一个 3×3 的高斯核可能如下

K = 1 16 [ 1 2 1 2 4 2 1 2 1 ] K = \frac{1}{16} \begin{bmatrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \\ \end{bmatrix} K=161 121242121

手动计算高斯核的示例

import cv2
import numpy as np# 生成二维高斯核
def gaussian_kernel(size, sigma):kernel = np.zeros((size, size))# // 是整数除法运算符, 会将结果向下取整到最接近的整数center = size // 2for x in range(size):for y in range(size):dx, dy = x - center, y - centerkernel[x, y] = np.exp(-(dx**2 + dy**2) / (2 * sigma**2))kernel /= kernel.sum()  # 归一化return kernel# 生成 σ=1.5 的 5x5 高斯核
kernel = gaussian_kernel(5, 1.5)
print(kernel)

矩阵中各元素的数值构成了一个三维高斯曲面, 中心点最高, 呈钟形向四周降低

SIFT(Scale-Invariant Feature Transform)算法

SIFT(Scale-Invariant Feature Transform)算法是一种用于图像处理中的局部特征提取方法, 具有尺度、旋转和光照不变性, 因为其结果稳定性和较高的精度在图像匹配中广泛应用. SIFT的缺点是计算复杂度较高, 在一些需要实时处理的场景被快速算法如SURF, ORB等替代. 在 COLMAP 中, 提取特征量和匹配基于的就是 SIFT 算法.

1. 尺度空间极值检测(Scale-Space Extrema Detection)

目的: 在多尺度空间中寻找关键点(潜在的特征点)

  • 构建高斯金字塔
    • 对图像进行不同尺度的高斯模糊(通过高斯卷积核 $ G(x,y,\sigma) $), 生成多组(Octave)图像. 每组包含多层(Interval), 尺度按 $ k\sigma $ 递增(如 $ \sigma, k\sigma, k^2\sigma $).
      • 不同尺度的高斯模糊是通过对图像应用不同标准差 σ \sigma σ 的高斯核进行卷积计算得到的
    • 下一组的图像由上一组降采样(如尺寸减半)得到.
  • 构建高斯差分金字塔(DoG)
    • 对同一组内相邻尺度的高斯图像相减, 得到 $ D(x,y,\sigma) = L(x,y,k\sigma) - L(x,y,\sigma) $
    • DoG用于近似拉普拉斯算子(LoG), 效率更高.
  • 检测极值点
    • 每个像素与同一层相邻的8个像素及上下相邻层的18个像素(共26个)比较, 判断是否为局部极大/极小值.

2. 关键点定位(Keypoint Localization)

目的: 精确定位关键点, 去除低对比度或边缘响应点

  • 泰勒展开精确定位
    • 通过泰勒展开拟合DoG函数, 找到极值点的亚像素级位置(偏移量 $ \hat{x} $)
    • 若 $ |D(\hat{x})| $ 小于阈值(如0.03), 则视为低对比度点, 剔除
  • 边缘响应剔除
    • 利用Hessian矩阵计算曲率, 剔除边缘响应强的点(主曲率比值大的点)
    • 若 $ \frac{\text{Tr}(H)^2}{\text{Det}(H)} > \frac{(r+1)^2}{r} $(通常 $ r=10 $), 则剔除

3. 方向分配(Orientation Assignment)

目的: 将关键点方向归一化处理, 以实现旋转不变性

  • 计算梯度幅值和方向
    • 在关键点所在高斯尺度图像上, 计算邻域窗口内像素的梯度:
      m ( x , y ) = ( L ( x + 1 , y ) − L ( x − 1 , y ) ) 2 + ( L ( x , y + 1 ) − L ( x , y − 1 ) ) 2 m(x,y) = \sqrt{(L(x+1,y)-L(x-1,y))^2 + (L(x,y+1)-L(x,y-1))^2} m(x,y)=(L(x+1,y)L(x1,y))2+(L(x,y+1)L(x,y1))2
      θ ( x , y ) = tan ⁡ − 1 ( L ( x , y + 1 ) − L ( x , y − 1 ) L ( x + 1 , y ) − L ( x − 1 , y ) ) \theta(x,y) = \tan^{-1}\left( \frac{L(x,y+1)-L(x,y-1)}{L(x+1,y)-L(x-1,y)} \right) θ(x,y)=tan1(L(x+1,y)L(x1,y)L(x,y+1)L(x,y1))
  • 生成方向直方图
    • 将360°分为36柱(每柱10°), 加权统计梯度幅值(权重为高斯窗口和梯度幅值).
    • 取主峰(最高峰值)和80%以上主峰的次峰作为关键点方向.

4. 关键点描述符(Descriptor Generation)

目的: 在方向归一化处理后, 通过划分子块生成关键点的特征向量

  • 旋转坐标轴: 将邻域窗口旋转至关键点主方向.
  • 划分子区域: 将16×16的窗口分为4×4的子块(共16块).
  • 计算子块梯度直方图:
    • 每个子块内计算8方向的梯度直方图(共8维).
    • 16个子块 × 8方向 = 128维特征向量.
  • 归一化处理:
    • 对特征向量归一化, 减少光照影响, 并截断大于0.2的值以增强鲁棒性.

5. 关键点匹配

  • 通过欧氏距离(如最近邻算法)比较两幅图像的SIFT描述符
  • 使用最近邻距离比(NNDR, 如 $ \frac{d_1}{d_2} < 0.8 $)筛选匹配点, 提升匹配精度.

在Python代码中通过OpenCV使用SIFT算法

提取关键点

import cv2
import matplotlib.pyplot as plt# 读取图像(转为灰度图)
img = cv2.imread('00001.jpg', cv2.IMREAD_GRAYSCALE)# 初始化 SIFT 检测器
sift = cv2.SIFT_create()# 检测关键点并计算描述符
keypoints, descriptors = sift.detectAndCompute(img, None)# 绘制关键点
img_with_keypoints = cv2.drawKeypoints(img, keypoints, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
)# 显示结果
plt.figure(figsize=(10, 6))
plt.imshow(img_with_keypoints, cmap='gray')
plt.title('SIFT Keypoints')
plt.axis('off')
plt.show()

双图关键点匹配

import cv2
import matplotlib.pyplot as plt# 读取两张图像
img1 = cv2.imread('00001.jpg', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('00006.jpg', cv2.IMREAD_GRAYSCALE)# 初始化 SIFT
sift = cv2.SIFT_create()# 计算关键点和描述符
kp1, desc1 = sift.detectAndCompute(img1, None)
kp2, desc2 = sift.detectAndCompute(img2, None)# 使用 BFMatcher(Brute-Force 匹配器)
bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True)
matches = bf.match(desc1, desc2)# 按距离排序,取最优匹配
matches = sorted(matches, key=lambda x: x.distance)# 绘制前 50 个匹配点
matched_img = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS
)# 显示匹配结果
plt.figure(figsize=(15, 8))
plt.imshow(matched_img, cmap='gray')
plt.title('SIFT Feature Matching')
plt.axis('off')
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Unity中实现《幽灵行者》风格的跑酷动作

基础设置 角色控制器选择&#xff1a; 使用Character Controller组件或Rigidbody Capsule Collider 推荐使用Character Controller以获得更精确的运动控制 输入系统&#xff1a; 使用Unity的新输入系统(Input System Package)处理玩家输入 滑铲实现 public class Slide…

青蛙吃虫--dp

1.dp数组有关元素--路长和次数 2.递推公式 3.遍历顺序--最终影响的是路长&#xff0c;在外面 其次次数遍历&#xff0c;即这次路长所有情况都更新 最后&#xff0c;遍历次数自然就要遍历跳长 4.max时时更新 dp版本 #include<bits/stdc.h> using namespace std; #def…

Tiktok 关键字 视频及评论信息爬虫(2) [2025.04.07]

&#x1f64b;‍♀️Tiktok APP的基于关键字检索的视频及评论信息爬虫共分为两期&#xff0c;希望对大家有所帮助。 第一期&#xff1a;基于关键字检索的视频信息爬取 第二期见下文。 1.Node.js环境配置 首先配置 JavaScript 运行环境&#xff08;如 Node.js&#xff09;&…

Matlab绘图—‘‘错误使用 plot输入参数的数目不足‘‘

原因1&#xff1a; ❤️ 文件列名不是合法变量名 在excel中数据列名称为Sample:float,将:删除就解决了

Kotlin问题汇总

Kotlin问题汇总 真机安装调试 查看真机的Android版本&#xff0c;将build.gradle文件中的minSdk改为手机的Android版本&#xff0c;点Sync Now更新设置 apk安装失败 在gradle.properties全局配置中设置android.injected.testOnlyfalse Unresolved reference: 在activity_…

基于VMware的Cent OS Stream 8安装与配置及远程连接软件的介绍

1.VMware Workstation 简介&#xff1a; VMware Workstation&#xff08;中文名“威睿工作站”&#xff09;是一款功能强大的桌面虚拟计算机软件&#xff0c;提供用户可在单一的桌面上同时运行不同的操作系统&#xff0c;和进行开发、测试 、部署新的应用程序的最佳解决方案。…

Go语言从零构建SQL数据库(4)-解析器

SQL解析器&#xff1a;数据库的"翻译官"图解与代码详解 图解SQL解析过程 SQL解析器就像是人类语言与计算机之间的翻译官&#xff0c;将我们书写的SQL语句转换成数据库能够理解和执行的结构。 #mermaid-svg-f9gAqHutDLL4McGy {font-family:"trebuchet ms"…

十道海量数据处理面试题与十个方法总结

一、十道海量数据处理面试题 ♟️1、海量日志数据&#xff0c;提取出某日访问百度次数最多的那个IP。(分治思想 哈希表) 首先&#xff0c;从日志中提取出所有访问百度的IP地址&#xff0c;将它们逐个写入一个大文件中&#xff0c;便于后续处理。 考虑到IP地址是32位的&#…

SolidWorks2025三维计算机辅助设计(3D CAD)软件超详细图文安装教程(2025最新版保姆级教程)

目录 前言 一、SolidWorks下载 二、SolidWorks安装 三、启动SolidWorks 前言 SolidWorks 是一款由法国达索系统&#xff08;Dassault Systmes&#xff09;公司开发的三维计算机辅助设计&#xff08;3D CAD&#xff09;软件&#xff0c;广泛用于机械设计、工程仿真和产品开…

IntelliJ IDEA 2020~2024 创建SpringBoot项目编辑报错: 程序包org.springframework.boot不存在

目录 前奏解决结尾 前奏 哈&#xff01;今天在处理我的SpringBoot项目时&#xff0c;突然遇到了一些让人摸不着头脑的错误提示&#xff1a; java: 程序包org.junit不存在 java: 程序包org.junit.runner不存在 java: 程序包org.springframework.boot.test.context不存在 java:…

CPU 压力测试命令大全

CPU 压力测试命令大全 以下是 Linux/Unix 系统下常用的 CPU 压力测试命令和工具&#xff0c;可用于测试 CPU 性能、稳定性和散热能力。 1. 基本压力测试命令 1.1 使用 yes 命令 yes > /dev/null & # 启动一个无限循环进程 yes > /dev/null & # 启动第二个进…

#SVA语法滴水穿石# (003)关于 sequence 和 property 的区别和联系

在 SystemVerilog Assertions (SVA) 中,sequence 和 property 是两个核心概念,它们既有区别又紧密相关。对于初学者,可能不需要过多理解;但是要想写出复杂精美的断言,深刻理解两者十分重要。今天,我们汇总和学习一下该知识点。 1. 区别 特性sequenceproperty定义描述一系…

WordPress浮动广告插件+飘动效果客服插件

源码介绍 WordPress浮动广告插件飘动效果客服插件 将源码上传到wordpress的插件根目录下&#xff0c;解压&#xff0c;然后后台启用即可 截图 源码免费获取 WordPress浮动广告插件飘动效果客服插件

虚幻基础:蓝图基础知识

文章目录 组件蓝图创建时&#xff0c;优先创建组件&#xff0c;如c一样。 UI控件控件不会自动创建&#xff0c;而是在蓝图创建函数中手动创建。 函数内使用S序列接退出&#xff0c;并不会等所有执行完再退出&#xff0c;而是一个执行完后直接退出 组件 蓝图创建时&#xff0c;…

《AI大模型应知应会100篇》加餐篇:LlamaIndex 与 LangChain 的无缝集成

加餐篇&#xff1a;LlamaIndex 与 LangChain 的无缝集成 问题背景&#xff1a;在实际应用中&#xff0c;开发者常常需要结合多个框架的优势。例如&#xff0c;使用 LangChain 管理复杂的业务逻辑链&#xff0c;同时利用 LlamaIndex 的高效索引和检索能力构建知识库。本文在基于…

深度学习项目--分组卷积与ResNext网络实验探究(pytorch复现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 ResNext是分组卷积的开始之作&#xff0c;这里本文将学习ResNext网络&#xff1b;本文复现了ResNext50神经网络&#xff0c;并用其进行了猴痘病分类实验…

从代码学习深度学习 - RNN PyTorch版

文章目录 前言一、数据预处理二、辅助训练工具函数三、绘图工具函数四、模型定义五、模型训练与预测六、实例化模型并训练训练结果可视化总结前言 循环神经网络(RNN)是深度学习中处理序列数据的重要模型,尤其在自然语言处理和时间序列分析中有着广泛应用。本篇博客将通过一…

JS DOM节点增删改查

增加节点 通过document.createNode()函数创建对象 // 创建节点 const div document.createElement(div) // 追加节点 document.body.appendChild(div) 克隆节点 删除节点

IMX6ULL学习整理篇——Linux使用更现代的GPIO操作简单设备

IMX6ULL学习篇——实战&#xff1a;使用设备树/Pinctl-gpio子系统驱动LED 前言 ​ 经过层层考验&#xff0c;我们即将接近现代的LED驱动的解决方案了。那就是使用最现代的方式开发一个简单的GPIO驱动外设。 ​ 如果您忘记了设备树的相关内容&#xff0c;请自行到笔者的上一篇…

2025-04-07 NO.3 Quest3 MR 配置

文章目录 1 MR 介绍1.1 透视1.2 场景理解1.3 空间设置 2 配置 MR 环境2.1 场景配置2.2 MR 配置 3 运行测试 配置环境&#xff1a; Windows 11Unity 6000.0.42f1Meta SDK v74.0.2Quest3 1 MR 介绍 1.1 透视 ​ 透视&#xff08;Passthrough&#xff09;是将应用的背景从虚拟的…