圖像處理中的 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πσ21?e?2σ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? ?121?242?121? ?

手動計算高斯核的示例

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(x?1,y))2+(L(x,y+1)?L(x,y?1))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)=tan?1(L(x+1,y)?L(x?1,y)L(x,y+1)?L(x,y?1)?)
  • 生成方向直方圖
    • 將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.pswp.cn/bicheng/76066.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76066.shtml
英文地址,請注明出處:http://en.pswp.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;是將應用的背景從虛擬的…