'圖像配準:從SIFT到深度學習'

深度學習 OpenCV 算法 FLOW 人工智能遇見磐創 2019-08-04
"
"
圖像配準:從SIFT到深度學習

目錄

  • 圖像配準:從SIFT到深度學習
  • 什麼是圖像配準
  • 傳統的基於特徵的方法
  • 關鍵點檢測和特徵描述
  • 特徵匹配
  • 圖像變換
  • 深度學習方法
  • 特徵提取
  • Homography學習
  • 監督學習
  • 無監督學習
  • 其他方法
  • 強化學習
  • 複雜的轉換

圖像配準(Image Registration)是計算機視覺中的基本步驟。在本文中,我們首先介紹基於OpenCV的方法,然後介紹深度學習的方法。

什麼是圖像配準

圖像配準就是找到一幅圖像像素到另一幅圖像像素間的空間映射關係。這些圖像可以是不同時間(多時間配準),不同傳感器在不同地方拍攝(多模式配準)。這些圖像之間的空間關係可以是剛性(rigid)[1](平移和旋轉),仿射(affine)[2](例如剪切),單應性[3](homographies)或複雜的大變形模型(complex large deformations models)。

"
圖像配準:從SIFT到深度學習

目錄

  • 圖像配準:從SIFT到深度學習
  • 什麼是圖像配準
  • 傳統的基於特徵的方法
  • 關鍵點檢測和特徵描述
  • 特徵匹配
  • 圖像變換
  • 深度學習方法
  • 特徵提取
  • Homography學習
  • 監督學習
  • 無監督學習
  • 其他方法
  • 強化學習
  • 複雜的轉換

圖像配準(Image Registration)是計算機視覺中的基本步驟。在本文中,我們首先介紹基於OpenCV的方法,然後介紹深度學習的方法。

什麼是圖像配準

圖像配準就是找到一幅圖像像素到另一幅圖像像素間的空間映射關係。這些圖像可以是不同時間(多時間配準),不同傳感器在不同地方拍攝(多模式配準)。這些圖像之間的空間關係可以是剛性(rigid)[1](平移和旋轉),仿射(affine)[2](例如剪切),單應性[3](homographies)或複雜的大變形模型(complex large deformations models)。

圖像配準:從SIFT到深度學習

圖像配準具有廣泛的應用,適用於同一個場景中有多張圖像需要進行匹配或疊加。在醫學圖像領域以及衛星圖像分析和光流(optical flow)方面非常普遍。

"
圖像配準:從SIFT到深度學習

目錄

  • 圖像配準:從SIFT到深度學習
  • 什麼是圖像配準
  • 傳統的基於特徵的方法
  • 關鍵點檢測和特徵描述
  • 特徵匹配
  • 圖像變換
  • 深度學習方法
  • 特徵提取
  • Homography學習
  • 監督學習
  • 無監督學習
  • 其他方法
  • 強化學習
  • 複雜的轉換

圖像配準(Image Registration)是計算機視覺中的基本步驟。在本文中,我們首先介紹基於OpenCV的方法,然後介紹深度學習的方法。

什麼是圖像配準

圖像配準就是找到一幅圖像像素到另一幅圖像像素間的空間映射關係。這些圖像可以是不同時間(多時間配準),不同傳感器在不同地方拍攝(多模式配準)。這些圖像之間的空間關係可以是剛性(rigid)[1](平移和旋轉),仿射(affine)[2](例如剪切),單應性[3](homographies)或複雜的大變形模型(complex large deformations models)。

圖像配準:從SIFT到深度學習

圖像配準具有廣泛的應用,適用於同一個場景中有多張圖像需要進行匹配或疊加。在醫學圖像領域以及衛星圖像分析和光流(optical flow)方面非常普遍。

圖像配準:從SIFT到深度學習

CT掃描和MRI配準

本文我們將介紹圖像配準的幾種不同方法。

傳統的基於特徵的方法

自21世紀初以來,圖像配準主要使用基於特徵的方法。這些方法有三個步驟:關鍵點檢測和特徵描述,特徵匹配,圖像變換。簡單的說,我們選擇兩個圖像中的感興趣點,將參考圖像(reference image)與感測圖像(sensed image)中的等價感興趣點進行關聯,然後變換感測圖像使兩個圖像對齊。

"
圖像配準:從SIFT到深度學習

目錄

  • 圖像配準:從SIFT到深度學習
  • 什麼是圖像配準
  • 傳統的基於特徵的方法
  • 關鍵點檢測和特徵描述
  • 特徵匹配
  • 圖像變換
  • 深度學習方法
  • 特徵提取
  • Homography學習
  • 監督學習
  • 無監督學習
  • 其他方法
  • 強化學習
  • 複雜的轉換

圖像配準(Image Registration)是計算機視覺中的基本步驟。在本文中,我們首先介紹基於OpenCV的方法,然後介紹深度學習的方法。

什麼是圖像配準

圖像配準就是找到一幅圖像像素到另一幅圖像像素間的空間映射關係。這些圖像可以是不同時間(多時間配準),不同傳感器在不同地方拍攝(多模式配準)。這些圖像之間的空間關係可以是剛性(rigid)[1](平移和旋轉),仿射(affine)[2](例如剪切),單應性[3](homographies)或複雜的大變形模型(complex large deformations models)。

圖像配準:從SIFT到深度學習

圖像配準具有廣泛的應用,適用於同一個場景中有多張圖像需要進行匹配或疊加。在醫學圖像領域以及衛星圖像分析和光流(optical flow)方面非常普遍。

圖像配準:從SIFT到深度學習

CT掃描和MRI配準

本文我們將介紹圖像配準的幾種不同方法。

傳統的基於特徵的方法

自21世紀初以來,圖像配準主要使用基於特徵的方法。這些方法有三個步驟:關鍵點檢測和特徵描述,特徵匹配,圖像變換。簡單的說,我們選擇兩個圖像中的感興趣點,將參考圖像(reference image)與感測圖像(sensed image)中的等價感興趣點進行關聯,然後變換感測圖像使兩個圖像對齊。

圖像配準:從SIFT到深度學習

基於特徵的方法

關鍵點檢測和特徵描述

關鍵點就是感興趣點,它表示圖像中重要或獨特的內容(邊角,邊緣等)。每個關鍵點由描述符表示,關鍵點基本特徵的特徵向量。描述符應該對圖像變換(定位,縮放,亮度等)具有魯棒性。許多算法使用關鍵點檢測和特徵描述:

  • SIFT[4](Scale-invariant feature transform)是用於關鍵點檢測的原始算法,但它不能免費用於商業用途。SIFT特徵描述符對於均勻縮放,方向,亮度變化和對仿射失真不變的部分不會發生變化。
  • SURF[5](Speeded Up Robust Features)是一個受SIFT啟發的探測器和描述符。它的優點是非常快。它同樣是有專利的。
  • ORB[6](Oriented FAST and Rotated BRIEF)是一種快速的二進制描述符,它基於 FAST[7](Features from Accelerated Segment Test)關鍵點檢測和 BRIEF[8](Binary robust independent elementary features)描述符的組合。它具有旋轉不變性和對噪聲的魯棒性。它由OpenCV實驗室開發,是SIFT有效的免費替代品。
  • AKAZE[9](Accelerated-KAZE)是KAZE[10]快速版本。它為非線性尺度空間[11]提供了快速的多尺度特徵檢測和描述方法,具有縮放和旋轉不變性。

這些算法都可以在OpenCV中輕鬆使用。在下面的例子中,我們使用了AKAZE的OpenCV實現。其他算法的代碼大致相同,只需要修改算法的名稱。

import numpy as np
import cv2 as cv

img = cv.imread('image.jpg')
gray= cv.cvtColor(img, cv.COLOR_BGR2GRAY)

akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)

img=cv.drawKeypoints(gray, kp, img)
cv.imwrite('keypoints.jpg', img)
"
圖像配準:從SIFT到深度學習

目錄

  • 圖像配準:從SIFT到深度學習
  • 什麼是圖像配準
  • 傳統的基於特徵的方法
  • 關鍵點檢測和特徵描述
  • 特徵匹配
  • 圖像變換
  • 深度學習方法
  • 特徵提取
  • Homography學習
  • 監督學習
  • 無監督學習
  • 其他方法
  • 強化學習
  • 複雜的轉換

圖像配準(Image Registration)是計算機視覺中的基本步驟。在本文中,我們首先介紹基於OpenCV的方法,然後介紹深度學習的方法。

什麼是圖像配準

圖像配準就是找到一幅圖像像素到另一幅圖像像素間的空間映射關係。這些圖像可以是不同時間(多時間配準),不同傳感器在不同地方拍攝(多模式配準)。這些圖像之間的空間關係可以是剛性(rigid)[1](平移和旋轉),仿射(affine)[2](例如剪切),單應性[3](homographies)或複雜的大變形模型(complex large deformations models)。

圖像配準:從SIFT到深度學習

圖像配準具有廣泛的應用,適用於同一個場景中有多張圖像需要進行匹配或疊加。在醫學圖像領域以及衛星圖像分析和光流(optical flow)方面非常普遍。

圖像配準:從SIFT到深度學習

CT掃描和MRI配準

本文我們將介紹圖像配準的幾種不同方法。

傳統的基於特徵的方法

自21世紀初以來,圖像配準主要使用基於特徵的方法。這些方法有三個步驟:關鍵點檢測和特徵描述,特徵匹配,圖像變換。簡單的說,我們選擇兩個圖像中的感興趣點,將參考圖像(reference image)與感測圖像(sensed image)中的等價感興趣點進行關聯,然後變換感測圖像使兩個圖像對齊。

圖像配準:從SIFT到深度學習

基於特徵的方法

關鍵點檢測和特徵描述

關鍵點就是感興趣點,它表示圖像中重要或獨特的內容(邊角,邊緣等)。每個關鍵點由描述符表示,關鍵點基本特徵的特徵向量。描述符應該對圖像變換(定位,縮放,亮度等)具有魯棒性。許多算法使用關鍵點檢測和特徵描述:

  • SIFT[4](Scale-invariant feature transform)是用於關鍵點檢測的原始算法,但它不能免費用於商業用途。SIFT特徵描述符對於均勻縮放,方向,亮度變化和對仿射失真不變的部分不會發生變化。
  • SURF[5](Speeded Up Robust Features)是一個受SIFT啟發的探測器和描述符。它的優點是非常快。它同樣是有專利的。
  • ORB[6](Oriented FAST and Rotated BRIEF)是一種快速的二進制描述符,它基於 FAST[7](Features from Accelerated Segment Test)關鍵點檢測和 BRIEF[8](Binary robust independent elementary features)描述符的組合。它具有旋轉不變性和對噪聲的魯棒性。它由OpenCV實驗室開發,是SIFT有效的免費替代品。
  • AKAZE[9](Accelerated-KAZE)是KAZE[10]快速版本。它為非線性尺度空間[11]提供了快速的多尺度特徵檢測和描述方法,具有縮放和旋轉不變性。

這些算法都可以在OpenCV中輕鬆使用。在下面的例子中,我們使用了AKAZE的OpenCV實現。其他算法的代碼大致相同,只需要修改算法的名稱。

import numpy as np
import cv2 as cv

img = cv.imread('image.jpg')
gray= cv.cvtColor(img, cv.COLOR_BGR2GRAY)

akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)

img=cv.drawKeypoints(gray, kp, img)
cv.imwrite('keypoints.jpg', img)
圖像配準:從SIFT到深度學習

圖像關鍵點

更過關於特徵提取和描述的文檔(https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html)

特徵匹配

一旦在一對圖像中識別出關鍵點,我們就需要將兩個圖像中對應的關鍵點進行關聯或“匹配”。其中一種方法是BFMatcher.knnMatch()。這個方法計算每對關鍵點之間的描述符的距離,並返回每個關鍵點的k個最佳匹配中的最小距離。

然後我們設定比率來保持正確率。實際上,為了使匹配更可靠,匹配的關鍵點需要比最近的錯誤匹配更靠近。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img1 = cv.imread('image1.jpg', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('image2.jpg', cv.IMREAD_GRAYSCALE)

# 初始化 AKAZE 探測器
akaze = cv.AKAZE_create()
# 使用 SIFT 查找關鍵點和描述
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)

# BFMatcher 默認參數
bf = cv.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

# 旋轉測試
good_matches = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good_matches.append([m])

# 畫匹配點
img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,good_matches,None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', img3)
"
圖像配準:從SIFT到深度學習

目錄

  • 圖像配準:從SIFT到深度學習
  • 什麼是圖像配準
  • 傳統的基於特徵的方法
  • 關鍵點檢測和特徵描述
  • 特徵匹配
  • 圖像變換
  • 深度學習方法
  • 特徵提取
  • Homography學習
  • 監督學習
  • 無監督學習
  • 其他方法
  • 強化學習
  • 複雜的轉換

圖像配準(Image Registration)是計算機視覺中的基本步驟。在本文中,我們首先介紹基於OpenCV的方法,然後介紹深度學習的方法。

什麼是圖像配準

圖像配準就是找到一幅圖像像素到另一幅圖像像素間的空間映射關係。這些圖像可以是不同時間(多時間配準),不同傳感器在不同地方拍攝(多模式配準)。這些圖像之間的空間關係可以是剛性(rigid)[1](平移和旋轉),仿射(affine)[2](例如剪切),單應性[3](homographies)或複雜的大變形模型(complex large deformations models)。

圖像配準:從SIFT到深度學習

圖像配準具有廣泛的應用,適用於同一個場景中有多張圖像需要進行匹配或疊加。在醫學圖像領域以及衛星圖像分析和光流(optical flow)方面非常普遍。

圖像配準:從SIFT到深度學習

CT掃描和MRI配準

本文我們將介紹圖像配準的幾種不同方法。

傳統的基於特徵的方法

自21世紀初以來,圖像配準主要使用基於特徵的方法。這些方法有三個步驟:關鍵點檢測和特徵描述,特徵匹配,圖像變換。簡單的說,我們選擇兩個圖像中的感興趣點,將參考圖像(reference image)與感測圖像(sensed image)中的等價感興趣點進行關聯,然後變換感測圖像使兩個圖像對齊。

圖像配準:從SIFT到深度學習

基於特徵的方法

關鍵點檢測和特徵描述

關鍵點就是感興趣點,它表示圖像中重要或獨特的內容(邊角,邊緣等)。每個關鍵點由描述符表示,關鍵點基本特徵的特徵向量。描述符應該對圖像變換(定位,縮放,亮度等)具有魯棒性。許多算法使用關鍵點檢測和特徵描述:

  • SIFT[4](Scale-invariant feature transform)是用於關鍵點檢測的原始算法,但它不能免費用於商業用途。SIFT特徵描述符對於均勻縮放,方向,亮度變化和對仿射失真不變的部分不會發生變化。
  • SURF[5](Speeded Up Robust Features)是一個受SIFT啟發的探測器和描述符。它的優點是非常快。它同樣是有專利的。
  • ORB[6](Oriented FAST and Rotated BRIEF)是一種快速的二進制描述符,它基於 FAST[7](Features from Accelerated Segment Test)關鍵點檢測和 BRIEF[8](Binary robust independent elementary features)描述符的組合。它具有旋轉不變性和對噪聲的魯棒性。它由OpenCV實驗室開發,是SIFT有效的免費替代品。
  • AKAZE[9](Accelerated-KAZE)是KAZE[10]快速版本。它為非線性尺度空間[11]提供了快速的多尺度特徵檢測和描述方法,具有縮放和旋轉不變性。

這些算法都可以在OpenCV中輕鬆使用。在下面的例子中,我們使用了AKAZE的OpenCV實現。其他算法的代碼大致相同,只需要修改算法的名稱。

import numpy as np
import cv2 as cv

img = cv.imread('image.jpg')
gray= cv.cvtColor(img, cv.COLOR_BGR2GRAY)

akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)

img=cv.drawKeypoints(gray, kp, img)
cv.imwrite('keypoints.jpg', img)
圖像配準:從SIFT到深度學習

圖像關鍵點

更過關於特徵提取和描述的文檔(https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html)

特徵匹配

一旦在一對圖像中識別出關鍵點,我們就需要將兩個圖像中對應的關鍵點進行關聯或“匹配”。其中一種方法是BFMatcher.knnMatch()。這個方法計算每對關鍵點之間的描述符的距離,並返回每個關鍵點的k個最佳匹配中的最小距離。

然後我們設定比率來保持正確率。實際上,為了使匹配更可靠,匹配的關鍵點需要比最近的錯誤匹配更靠近。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img1 = cv.imread('image1.jpg', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('image2.jpg', cv.IMREAD_GRAYSCALE)

# 初始化 AKAZE 探測器
akaze = cv.AKAZE_create()
# 使用 SIFT 查找關鍵點和描述
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)

# BFMatcher 默認參數
bf = cv.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

# 旋轉測試
good_matches = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good_matches.append([m])

# 畫匹配點
img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,good_matches,None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', img3)
圖像配準:從SIFT到深度學習

匹配的關鍵點

OpenCV中有更多關於特徵匹配的實現方法(https://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html)

圖像變換

在匹配至少四對關鍵點之後,我們就可以將一個圖像轉換為另一個圖像,稱為圖像變換[12](image warping)。空間中相同平面的兩個圖像通過單應性變換[13](Homographies)進行關聯。Homographies是具有8個自由參數的幾何變換,由3x3矩陣表示圖像的整體變換(與局部變換相反)。因此,為了獲得變換後的感測圖像,需要計算Homographies矩陣。

為了得到最佳的變換,我們需要使用RANSAC算法檢測異常值並去除。它內置在OpenCV的findHomography方法中。同時也存在RANSAC算法的替代方案,例如LMEDS: Least-Median魯棒方法。

# 選擇匹配關鍵點
ref_matched_kpts = np.float32([kp1[m[0].queryIdx].pt for m in good_matches]).reshape(-1,1,2)
sensed_matched_kpts = np.float32([kp2[m[0].trainIdx].pt for m in good_matches]).reshape(-1,1,2)

# 計算 homography
H, status = cv.findHomography(ref_matched_kpts, sensed_matched_kpts, cv.RANSAC,5.0)

# 變換
warped_image = cv.warpPerspective(img1, H, (img1.shape[1]+img2.shape[1], img1.shape[0]))

cv.imwrite('warped.jpg', warped_image)
"
圖像配準:從SIFT到深度學習

目錄

  • 圖像配準:從SIFT到深度學習
  • 什麼是圖像配準
  • 傳統的基於特徵的方法
  • 關鍵點檢測和特徵描述
  • 特徵匹配
  • 圖像變換
  • 深度學習方法
  • 特徵提取
  • Homography學習
  • 監督學習
  • 無監督學習
  • 其他方法
  • 強化學習
  • 複雜的轉換

圖像配準(Image Registration)是計算機視覺中的基本步驟。在本文中,我們首先介紹基於OpenCV的方法,然後介紹深度學習的方法。

什麼是圖像配準

圖像配準就是找到一幅圖像像素到另一幅圖像像素間的空間映射關係。這些圖像可以是不同時間(多時間配準),不同傳感器在不同地方拍攝(多模式配準)。這些圖像之間的空間關係可以是剛性(rigid)[1](平移和旋轉),仿射(affine)[2](例如剪切),單應性[3](homographies)或複雜的大變形模型(complex large deformations models)。

圖像配準:從SIFT到深度學習

圖像配準具有廣泛的應用,適用於同一個場景中有多張圖像需要進行匹配或疊加。在醫學圖像領域以及衛星圖像分析和光流(optical flow)方面非常普遍。

圖像配準:從SIFT到深度學習

CT掃描和MRI配準

本文我們將介紹圖像配準的幾種不同方法。

傳統的基於特徵的方法

自21世紀初以來,圖像配準主要使用基於特徵的方法。這些方法有三個步驟:關鍵點檢測和特徵描述,特徵匹配,圖像變換。簡單的說,我們選擇兩個圖像中的感興趣點,將參考圖像(reference image)與感測圖像(sensed image)中的等價感興趣點進行關聯,然後變換感測圖像使兩個圖像對齊。

圖像配準:從SIFT到深度學習

基於特徵的方法

關鍵點檢測和特徵描述

關鍵點就是感興趣點,它表示圖像中重要或獨特的內容(邊角,邊緣等)。每個關鍵點由描述符表示,關鍵點基本特徵的特徵向量。描述符應該對圖像變換(定位,縮放,亮度等)具有魯棒性。許多算法使用關鍵點檢測和特徵描述:

  • SIFT[4](Scale-invariant feature transform)是用於關鍵點檢測的原始算法,但它不能免費用於商業用途。SIFT特徵描述符對於均勻縮放,方向,亮度變化和對仿射失真不變的部分不會發生變化。
  • SURF[5](Speeded Up Robust Features)是一個受SIFT啟發的探測器和描述符。它的優點是非常快。它同樣是有專利的。
  • ORB[6](Oriented FAST and Rotated BRIEF)是一種快速的二進制描述符,它基於 FAST[7](Features from Accelerated Segment Test)關鍵點檢測和 BRIEF[8](Binary robust independent elementary features)描述符的組合。它具有旋轉不變性和對噪聲的魯棒性。它由OpenCV實驗室開發,是SIFT有效的免費替代品。
  • AKAZE[9](Accelerated-KAZE)是KAZE[10]快速版本。它為非線性尺度空間[11]提供了快速的多尺度特徵檢測和描述方法,具有縮放和旋轉不變性。

這些算法都可以在OpenCV中輕鬆使用。在下面的例子中,我們使用了AKAZE的OpenCV實現。其他算法的代碼大致相同,只需要修改算法的名稱。

import numpy as np
import cv2 as cv

img = cv.imread('image.jpg')
gray= cv.cvtColor(img, cv.COLOR_BGR2GRAY)

akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)

img=cv.drawKeypoints(gray, kp, img)
cv.imwrite('keypoints.jpg', img)
圖像配準:從SIFT到深度學習

圖像關鍵點

更過關於特徵提取和描述的文檔(https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html)

特徵匹配

一旦在一對圖像中識別出關鍵點,我們就需要將兩個圖像中對應的關鍵點進行關聯或“匹配”。其中一種方法是BFMatcher.knnMatch()。這個方法計算每對關鍵點之間的描述符的距離,並返回每個關鍵點的k個最佳匹配中的最小距離。

然後我們設定比率來保持正確率。實際上,為了使匹配更可靠,匹配的關鍵點需要比最近的錯誤匹配更靠近。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img1 = cv.imread('image1.jpg', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('image2.jpg', cv.IMREAD_GRAYSCALE)

# 初始化 AKAZE 探測器
akaze = cv.AKAZE_create()
# 使用 SIFT 查找關鍵點和描述
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)

# BFMatcher 默認參數
bf = cv.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

# 旋轉測試
good_matches = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good_matches.append([m])

# 畫匹配點
img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,good_matches,None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', img3)
圖像配準:從SIFT到深度學習

匹配的關鍵點

OpenCV中有更多關於特徵匹配的實現方法(https://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html)

圖像變換

在匹配至少四對關鍵點之後,我們就可以將一個圖像轉換為另一個圖像,稱為圖像變換[12](image warping)。空間中相同平面的兩個圖像通過單應性變換[13](Homographies)進行關聯。Homographies是具有8個自由參數的幾何變換,由3x3矩陣表示圖像的整體變換(與局部變換相反)。因此,為了獲得變換後的感測圖像,需要計算Homographies矩陣。

為了得到最佳的變換,我們需要使用RANSAC算法檢測異常值並去除。它內置在OpenCV的findHomography方法中。同時也存在RANSAC算法的替代方案,例如LMEDS: Least-Median魯棒方法。

# 選擇匹配關鍵點
ref_matched_kpts = np.float32([kp1[m[0].queryIdx].pt for m in good_matches]).reshape(-1,1,2)
sensed_matched_kpts = np.float32([kp2[m[0].trainIdx].pt for m in good_matches]).reshape(-1,1,2)

# 計算 homography
H, status = cv.findHomography(ref_matched_kpts, sensed_matched_kpts, cv.RANSAC,5.0)

# 變換
warped_image = cv.warpPerspective(img1, H, (img1.shape[1]+img2.shape[1], img1.shape[0]))

cv.imwrite('warped.jpg', warped_image)
圖像配準:從SIFT到深度學習

變換後的圖像

OpenCV中對這三個步驟進行了綜合敘述(https://docs.opencv.org/3.1.0/db/d27/tutorial_py_table_of_contents_feature2d.html)

深度學習方法

目前大多數關於圖像配準的研究涉及深度學習。在過去的幾年中,深度學習使計算機視覺任務具有先進的性能,如圖像分類,物體檢測和分割。

特徵提取

深度學習用於圖像配準的第一種方式是用於特徵提取。卷積神經網絡設法獲得越來越複雜的圖像特徵並進行學習。2014年以來,研究人員將這些網絡應用於特徵提取的步驟,而不是使用SIFT或類似算法。

  • 2014年,Dosovitskiy等人提出了一種通用的特徵提取方法,使用未標記的數據訓練卷積神經網絡。這些特徵的通用性使轉換具有魯棒性。這些特徵或描述符的性能優於SIFT描述符以匹配任務。
  • 2018年,Yang等人開發了一種基於相同思想的非剛性配準方法。他們使用預訓練的VGG網絡層來生成一個特徵描述符,同時保留卷積信息和局部特徵。這些描述符的性能也優於類似SIFT的探測器,特別是在SIFT包含許多異常值或無法匹配足夠數量特徵點的情況下。
"
圖像配準:從SIFT到深度學習

目錄

  • 圖像配準:從SIFT到深度學習
  • 什麼是圖像配準
  • 傳統的基於特徵的方法
  • 關鍵點檢測和特徵描述
  • 特徵匹配
  • 圖像變換
  • 深度學習方法
  • 特徵提取
  • Homography學習
  • 監督學習
  • 無監督學習
  • 其他方法
  • 強化學習
  • 複雜的轉換

圖像配準(Image Registration)是計算機視覺中的基本步驟。在本文中,我們首先介紹基於OpenCV的方法,然後介紹深度學習的方法。

什麼是圖像配準

圖像配準就是找到一幅圖像像素到另一幅圖像像素間的空間映射關係。這些圖像可以是不同時間(多時間配準),不同傳感器在不同地方拍攝(多模式配準)。這些圖像之間的空間關係可以是剛性(rigid)[1](平移和旋轉),仿射(affine)[2](例如剪切),單應性[3](homographies)或複雜的大變形模型(complex large deformations models)。

圖像配準:從SIFT到深度學習

圖像配準具有廣泛的應用,適用於同一個場景中有多張圖像需要進行匹配或疊加。在醫學圖像領域以及衛星圖像分析和光流(optical flow)方面非常普遍。

圖像配準:從SIFT到深度學習

CT掃描和MRI配準

本文我們將介紹圖像配準的幾種不同方法。

傳統的基於特徵的方法

自21世紀初以來,圖像配準主要使用基於特徵的方法。這些方法有三個步驟:關鍵點檢測和特徵描述,特徵匹配,圖像變換。簡單的說,我們選擇兩個圖像中的感興趣點,將參考圖像(reference image)與感測圖像(sensed image)中的等價感興趣點進行關聯,然後變換感測圖像使兩個圖像對齊。

圖像配準:從SIFT到深度學習

基於特徵的方法

關鍵點檢測和特徵描述

關鍵點就是感興趣點,它表示圖像中重要或獨特的內容(邊角,邊緣等)。每個關鍵點由描述符表示,關鍵點基本特徵的特徵向量。描述符應該對圖像變換(定位,縮放,亮度等)具有魯棒性。許多算法使用關鍵點檢測和特徵描述:

  • SIFT[4](Scale-invariant feature transform)是用於關鍵點檢測的原始算法,但它不能免費用於商業用途。SIFT特徵描述符對於均勻縮放,方向,亮度變化和對仿射失真不變的部分不會發生變化。
  • SURF[5](Speeded Up Robust Features)是一個受SIFT啟發的探測器和描述符。它的優點是非常快。它同樣是有專利的。
  • ORB[6](Oriented FAST and Rotated BRIEF)是一種快速的二進制描述符,它基於 FAST[7](Features from Accelerated Segment Test)關鍵點檢測和 BRIEF[8](Binary robust independent elementary features)描述符的組合。它具有旋轉不變性和對噪聲的魯棒性。它由OpenCV實驗室開發,是SIFT有效的免費替代品。
  • AKAZE[9](Accelerated-KAZE)是KAZE[10]快速版本。它為非線性尺度空間[11]提供了快速的多尺度特徵檢測和描述方法,具有縮放和旋轉不變性。

這些算法都可以在OpenCV中輕鬆使用。在下面的例子中,我們使用了AKAZE的OpenCV實現。其他算法的代碼大致相同,只需要修改算法的名稱。

import numpy as np
import cv2 as cv

img = cv.imread('image.jpg')
gray= cv.cvtColor(img, cv.COLOR_BGR2GRAY)

akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)

img=cv.drawKeypoints(gray, kp, img)
cv.imwrite('keypoints.jpg', img)
圖像配準:從SIFT到深度學習

圖像關鍵點

更過關於特徵提取和描述的文檔(https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html)

特徵匹配

一旦在一對圖像中識別出關鍵點,我們就需要將兩個圖像中對應的關鍵點進行關聯或“匹配”。其中一種方法是BFMatcher.knnMatch()。這個方法計算每對關鍵點之間的描述符的距離,並返回每個關鍵點的k個最佳匹配中的最小距離。

然後我們設定比率來保持正確率。實際上,為了使匹配更可靠,匹配的關鍵點需要比最近的錯誤匹配更靠近。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img1 = cv.imread('image1.jpg', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('image2.jpg', cv.IMREAD_GRAYSCALE)

# 初始化 AKAZE 探測器
akaze = cv.AKAZE_create()
# 使用 SIFT 查找關鍵點和描述
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)

# BFMatcher 默認參數
bf = cv.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

# 旋轉測試
good_matches = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good_matches.append([m])

# 畫匹配點
img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,good_matches,None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', img3)
圖像配準:從SIFT到深度學習

匹配的關鍵點

OpenCV中有更多關於特徵匹配的實現方法(https://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html)

圖像變換

在匹配至少四對關鍵點之後,我們就可以將一個圖像轉換為另一個圖像,稱為圖像變換[12](image warping)。空間中相同平面的兩個圖像通過單應性變換[13](Homographies)進行關聯。Homographies是具有8個自由參數的幾何變換,由3x3矩陣表示圖像的整體變換(與局部變換相反)。因此,為了獲得變換後的感測圖像,需要計算Homographies矩陣。

為了得到最佳的變換,我們需要使用RANSAC算法檢測異常值並去除。它內置在OpenCV的findHomography方法中。同時也存在RANSAC算法的替代方案,例如LMEDS: Least-Median魯棒方法。

# 選擇匹配關鍵點
ref_matched_kpts = np.float32([kp1[m[0].queryIdx].pt for m in good_matches]).reshape(-1,1,2)
sensed_matched_kpts = np.float32([kp2[m[0].trainIdx].pt for m in good_matches]).reshape(-1,1,2)

# 計算 homography
H, status = cv.findHomography(ref_matched_kpts, sensed_matched_kpts, cv.RANSAC,5.0)

# 變換
warped_image = cv.warpPerspective(img1, H, (img1.shape[1]+img2.shape[1], img1.shape[0]))

cv.imwrite('warped.jpg', warped_image)
圖像配準:從SIFT到深度學習

變換後的圖像

OpenCV中對這三個步驟進行了綜合敘述(https://docs.opencv.org/3.1.0/db/d27/tutorial_py_table_of_contents_feature2d.html)

深度學習方法

目前大多數關於圖像配準的研究涉及深度學習。在過去的幾年中,深度學習使計算機視覺任務具有先進的性能,如圖像分類,物體檢測和分割。

特徵提取

深度學習用於圖像配準的第一種方式是用於特徵提取。卷積神經網絡設法獲得越來越複雜的圖像特徵並進行學習。2014年以來,研究人員將這些網絡應用於特徵提取的步驟,而不是使用SIFT或類似算法。

  • 2014年,Dosovitskiy等人提出了一種通用的特徵提取方法,使用未標記的數據訓練卷積神經網絡。這些特徵的通用性使轉換具有魯棒性。這些特徵或描述符的性能優於SIFT描述符以匹配任務。
  • 2018年,Yang等人開發了一種基於相同思想的非剛性配準方法。他們使用預訓練的VGG網絡層來生成一個特徵描述符,同時保留卷積信息和局部特徵。這些描述符的性能也優於類似SIFT的探測器,特別是在SIFT包含許多異常值或無法匹配足夠數量特徵點的情況下。
圖像配準:從SIFT到深度學習

SIFT和基於深度學習的非剛性配準方法描述符的結果

Homography學習

研究人員利用神經網絡直接學習幾何變換對齊兩幅圖像,而不僅僅侷限於特徵提取。

監督學習

在2016年,DeTone等人發表了 Deep Image Homography Estimation,提出了HomographyNe迴歸網絡,這是一種VGG風格模型,可以學習兩幅相關圖像的單應性。該算法具有以端到端的方式同時學習單應性和CNN模型參數的優勢,不需要前兩個階段的過程!

"
圖像配準:從SIFT到深度學習

目錄

  • 圖像配準:從SIFT到深度學習
  • 什麼是圖像配準
  • 傳統的基於特徵的方法
  • 關鍵點檢測和特徵描述
  • 特徵匹配
  • 圖像變換
  • 深度學習方法
  • 特徵提取
  • Homography學習
  • 監督學習
  • 無監督學習
  • 其他方法
  • 強化學習
  • 複雜的轉換

圖像配準(Image Registration)是計算機視覺中的基本步驟。在本文中,我們首先介紹基於OpenCV的方法,然後介紹深度學習的方法。

什麼是圖像配準

圖像配準就是找到一幅圖像像素到另一幅圖像像素間的空間映射關係。這些圖像可以是不同時間(多時間配準),不同傳感器在不同地方拍攝(多模式配準)。這些圖像之間的空間關係可以是剛性(rigid)[1](平移和旋轉),仿射(affine)[2](例如剪切),單應性[3](homographies)或複雜的大變形模型(complex large deformations models)。

圖像配準:從SIFT到深度學習

圖像配準具有廣泛的應用,適用於同一個場景中有多張圖像需要進行匹配或疊加。在醫學圖像領域以及衛星圖像分析和光流(optical flow)方面非常普遍。

圖像配準:從SIFT到深度學習

CT掃描和MRI配準

本文我們將介紹圖像配準的幾種不同方法。

傳統的基於特徵的方法

自21世紀初以來,圖像配準主要使用基於特徵的方法。這些方法有三個步驟:關鍵點檢測和特徵描述,特徵匹配,圖像變換。簡單的說,我們選擇兩個圖像中的感興趣點,將參考圖像(reference image)與感測圖像(sensed image)中的等價感興趣點進行關聯,然後變換感測圖像使兩個圖像對齊。

圖像配準:從SIFT到深度學習

基於特徵的方法

關鍵點檢測和特徵描述

關鍵點就是感興趣點,它表示圖像中重要或獨特的內容(邊角,邊緣等)。每個關鍵點由描述符表示,關鍵點基本特徵的特徵向量。描述符應該對圖像變換(定位,縮放,亮度等)具有魯棒性。許多算法使用關鍵點檢測和特徵描述:

  • SIFT[4](Scale-invariant feature transform)是用於關鍵點檢測的原始算法,但它不能免費用於商業用途。SIFT特徵描述符對於均勻縮放,方向,亮度變化和對仿射失真不變的部分不會發生變化。
  • SURF[5](Speeded Up Robust Features)是一個受SIFT啟發的探測器和描述符。它的優點是非常快。它同樣是有專利的。
  • ORB[6](Oriented FAST and Rotated BRIEF)是一種快速的二進制描述符,它基於 FAST[7](Features from Accelerated Segment Test)關鍵點檢測和 BRIEF[8](Binary robust independent elementary features)描述符的組合。它具有旋轉不變性和對噪聲的魯棒性。它由OpenCV實驗室開發,是SIFT有效的免費替代品。
  • AKAZE[9](Accelerated-KAZE)是KAZE[10]快速版本。它為非線性尺度空間[11]提供了快速的多尺度特徵檢測和描述方法,具有縮放和旋轉不變性。

這些算法都可以在OpenCV中輕鬆使用。在下面的例子中,我們使用了AKAZE的OpenCV實現。其他算法的代碼大致相同,只需要修改算法的名稱。

import numpy as np
import cv2 as cv

img = cv.imread('image.jpg')
gray= cv.cvtColor(img, cv.COLOR_BGR2GRAY)

akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)

img=cv.drawKeypoints(gray, kp, img)
cv.imwrite('keypoints.jpg', img)
圖像配準:從SIFT到深度學習

圖像關鍵點

更過關於特徵提取和描述的文檔(https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html)

特徵匹配

一旦在一對圖像中識別出關鍵點,我們就需要將兩個圖像中對應的關鍵點進行關聯或“匹配”。其中一種方法是BFMatcher.knnMatch()。這個方法計算每對關鍵點之間的描述符的距離,並返回每個關鍵點的k個最佳匹配中的最小距離。

然後我們設定比率來保持正確率。實際上,為了使匹配更可靠,匹配的關鍵點需要比最近的錯誤匹配更靠近。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img1 = cv.imread('image1.jpg', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('image2.jpg', cv.IMREAD_GRAYSCALE)

# 初始化 AKAZE 探測器
akaze = cv.AKAZE_create()
# 使用 SIFT 查找關鍵點和描述
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)

# BFMatcher 默認參數
bf = cv.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

# 旋轉測試
good_matches = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good_matches.append([m])

# 畫匹配點
img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,good_matches,None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', img3)
圖像配準:從SIFT到深度學習

匹配的關鍵點

OpenCV中有更多關於特徵匹配的實現方法(https://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html)

圖像變換

在匹配至少四對關鍵點之後,我們就可以將一個圖像轉換為另一個圖像,稱為圖像變換[12](image warping)。空間中相同平面的兩個圖像通過單應性變換[13](Homographies)進行關聯。Homographies是具有8個自由參數的幾何變換,由3x3矩陣表示圖像的整體變換(與局部變換相反)。因此,為了獲得變換後的感測圖像,需要計算Homographies矩陣。

為了得到最佳的變換,我們需要使用RANSAC算法檢測異常值並去除。它內置在OpenCV的findHomography方法中。同時也存在RANSAC算法的替代方案,例如LMEDS: Least-Median魯棒方法。

# 選擇匹配關鍵點
ref_matched_kpts = np.float32([kp1[m[0].queryIdx].pt for m in good_matches]).reshape(-1,1,2)
sensed_matched_kpts = np.float32([kp2[m[0].trainIdx].pt for m in good_matches]).reshape(-1,1,2)

# 計算 homography
H, status = cv.findHomography(ref_matched_kpts, sensed_matched_kpts, cv.RANSAC,5.0)

# 變換
warped_image = cv.warpPerspective(img1, H, (img1.shape[1]+img2.shape[1], img1.shape[0]))

cv.imwrite('warped.jpg', warped_image)
圖像配準:從SIFT到深度學習

變換後的圖像

OpenCV中對這三個步驟進行了綜合敘述(https://docs.opencv.org/3.1.0/db/d27/tutorial_py_table_of_contents_feature2d.html)

深度學習方法

目前大多數關於圖像配準的研究涉及深度學習。在過去的幾年中,深度學習使計算機視覺任務具有先進的性能,如圖像分類,物體檢測和分割。

特徵提取

深度學習用於圖像配準的第一種方式是用於特徵提取。卷積神經網絡設法獲得越來越複雜的圖像特徵並進行學習。2014年以來,研究人員將這些網絡應用於特徵提取的步驟,而不是使用SIFT或類似算法。

  • 2014年,Dosovitskiy等人提出了一種通用的特徵提取方法,使用未標記的數據訓練卷積神經網絡。這些特徵的通用性使轉換具有魯棒性。這些特徵或描述符的性能優於SIFT描述符以匹配任務。
  • 2018年,Yang等人開發了一種基於相同思想的非剛性配準方法。他們使用預訓練的VGG網絡層來生成一個特徵描述符,同時保留卷積信息和局部特徵。這些描述符的性能也優於類似SIFT的探測器,特別是在SIFT包含許多異常值或無法匹配足夠數量特徵點的情況下。
圖像配準:從SIFT到深度學習

SIFT和基於深度學習的非剛性配準方法描述符的結果

Homography學習

研究人員利用神經網絡直接學習幾何變換對齊兩幅圖像,而不僅僅侷限於特徵提取。

監督學習

在2016年,DeTone等人發表了 Deep Image Homography Estimation,提出了HomographyNe迴歸網絡,這是一種VGG風格模型,可以學習兩幅相關圖像的單應性。該算法具有以端到端的方式同時學習單應性和CNN模型參數的優勢,不需要前兩個階段的過程!

圖像配準:從SIFT到深度學習

HomographyNet迴歸網絡

網絡產生八個數值作為輸出。以監督的方式進行訓練,並計算輸出和真實單應性之間的歐幾里德損失。

"
圖像配準:從SIFT到深度學習

目錄

  • 圖像配準:從SIFT到深度學習
  • 什麼是圖像配準
  • 傳統的基於特徵的方法
  • 關鍵點檢測和特徵描述
  • 特徵匹配
  • 圖像變換
  • 深度學習方法
  • 特徵提取
  • Homography學習
  • 監督學習
  • 無監督學習
  • 其他方法
  • 強化學習
  • 複雜的轉換

圖像配準(Image Registration)是計算機視覺中的基本步驟。在本文中,我們首先介紹基於OpenCV的方法,然後介紹深度學習的方法。

什麼是圖像配準

圖像配準就是找到一幅圖像像素到另一幅圖像像素間的空間映射關係。這些圖像可以是不同時間(多時間配準),不同傳感器在不同地方拍攝(多模式配準)。這些圖像之間的空間關係可以是剛性(rigid)[1](平移和旋轉),仿射(affine)[2](例如剪切),單應性[3](homographies)或複雜的大變形模型(complex large deformations models)。

圖像配準:從SIFT到深度學習

圖像配準具有廣泛的應用,適用於同一個場景中有多張圖像需要進行匹配或疊加。在醫學圖像領域以及衛星圖像分析和光流(optical flow)方面非常普遍。

圖像配準:從SIFT到深度學習

CT掃描和MRI配準

本文我們將介紹圖像配準的幾種不同方法。

傳統的基於特徵的方法

自21世紀初以來,圖像配準主要使用基於特徵的方法。這些方法有三個步驟:關鍵點檢測和特徵描述,特徵匹配,圖像變換。簡單的說,我們選擇兩個圖像中的感興趣點,將參考圖像(reference image)與感測圖像(sensed image)中的等價感興趣點進行關聯,然後變換感測圖像使兩個圖像對齊。

圖像配準:從SIFT到深度學習

基於特徵的方法

關鍵點檢測和特徵描述

關鍵點就是感興趣點,它表示圖像中重要或獨特的內容(邊角,邊緣等)。每個關鍵點由描述符表示,關鍵點基本特徵的特徵向量。描述符應該對圖像變換(定位,縮放,亮度等)具有魯棒性。許多算法使用關鍵點檢測和特徵描述:

  • SIFT[4](Scale-invariant feature transform)是用於關鍵點檢測的原始算法,但它不能免費用於商業用途。SIFT特徵描述符對於均勻縮放,方向,亮度變化和對仿射失真不變的部分不會發生變化。
  • SURF[5](Speeded Up Robust Features)是一個受SIFT啟發的探測器和描述符。它的優點是非常快。它同樣是有專利的。
  • ORB[6](Oriented FAST and Rotated BRIEF)是一種快速的二進制描述符,它基於 FAST[7](Features from Accelerated Segment Test)關鍵點檢測和 BRIEF[8](Binary robust independent elementary features)描述符的組合。它具有旋轉不變性和對噪聲的魯棒性。它由OpenCV實驗室開發,是SIFT有效的免費替代品。
  • AKAZE[9](Accelerated-KAZE)是KAZE[10]快速版本。它為非線性尺度空間[11]提供了快速的多尺度特徵檢測和描述方法,具有縮放和旋轉不變性。

這些算法都可以在OpenCV中輕鬆使用。在下面的例子中,我們使用了AKAZE的OpenCV實現。其他算法的代碼大致相同,只需要修改算法的名稱。

import numpy as np
import cv2 as cv

img = cv.imread('image.jpg')
gray= cv.cvtColor(img, cv.COLOR_BGR2GRAY)

akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)

img=cv.drawKeypoints(gray, kp, img)
cv.imwrite('keypoints.jpg', img)
圖像配準:從SIFT到深度學習

圖像關鍵點

更過關於特徵提取和描述的文檔(https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html)

特徵匹配

一旦在一對圖像中識別出關鍵點,我們就需要將兩個圖像中對應的關鍵點進行關聯或“匹配”。其中一種方法是BFMatcher.knnMatch()。這個方法計算每對關鍵點之間的描述符的距離,並返回每個關鍵點的k個最佳匹配中的最小距離。

然後我們設定比率來保持正確率。實際上,為了使匹配更可靠,匹配的關鍵點需要比最近的錯誤匹配更靠近。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img1 = cv.imread('image1.jpg', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('image2.jpg', cv.IMREAD_GRAYSCALE)

# 初始化 AKAZE 探測器
akaze = cv.AKAZE_create()
# 使用 SIFT 查找關鍵點和描述
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)

# BFMatcher 默認參數
bf = cv.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

# 旋轉測試
good_matches = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good_matches.append([m])

# 畫匹配點
img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,good_matches,None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', img3)
圖像配準:從SIFT到深度學習

匹配的關鍵點

OpenCV中有更多關於特徵匹配的實現方法(https://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html)

圖像變換

在匹配至少四對關鍵點之後,我們就可以將一個圖像轉換為另一個圖像,稱為圖像變換[12](image warping)。空間中相同平面的兩個圖像通過單應性變換[13](Homographies)進行關聯。Homographies是具有8個自由參數的幾何變換,由3x3矩陣表示圖像的整體變換(與局部變換相反)。因此,為了獲得變換後的感測圖像,需要計算Homographies矩陣。

為了得到最佳的變換,我們需要使用RANSAC算法檢測異常值並去除。它內置在OpenCV的findHomography方法中。同時也存在RANSAC算法的替代方案,例如LMEDS: Least-Median魯棒方法。

# 選擇匹配關鍵點
ref_matched_kpts = np.float32([kp1[m[0].queryIdx].pt for m in good_matches]).reshape(-1,1,2)
sensed_matched_kpts = np.float32([kp2[m[0].trainIdx].pt for m in good_matches]).reshape(-1,1,2)

# 計算 homography
H, status = cv.findHomography(ref_matched_kpts, sensed_matched_kpts, cv.RANSAC,5.0)

# 變換
warped_image = cv.warpPerspective(img1, H, (img1.shape[1]+img2.shape[1], img1.shape[0]))

cv.imwrite('warped.jpg', warped_image)
圖像配準:從SIFT到深度學習

變換後的圖像

OpenCV中對這三個步驟進行了綜合敘述(https://docs.opencv.org/3.1.0/db/d27/tutorial_py_table_of_contents_feature2d.html)

深度學習方法

目前大多數關於圖像配準的研究涉及深度學習。在過去的幾年中,深度學習使計算機視覺任務具有先進的性能,如圖像分類,物體檢測和分割。

特徵提取

深度學習用於圖像配準的第一種方式是用於特徵提取。卷積神經網絡設法獲得越來越複雜的圖像特徵並進行學習。2014年以來,研究人員將這些網絡應用於特徵提取的步驟,而不是使用SIFT或類似算法。

  • 2014年,Dosovitskiy等人提出了一種通用的特徵提取方法,使用未標記的數據訓練卷積神經網絡。這些特徵的通用性使轉換具有魯棒性。這些特徵或描述符的性能優於SIFT描述符以匹配任務。
  • 2018年,Yang等人開發了一種基於相同思想的非剛性配準方法。他們使用預訓練的VGG網絡層來生成一個特徵描述符,同時保留卷積信息和局部特徵。這些描述符的性能也優於類似SIFT的探測器,特別是在SIFT包含許多異常值或無法匹配足夠數量特徵點的情況下。
圖像配準:從SIFT到深度學習

SIFT和基於深度學習的非剛性配準方法描述符的結果

Homography學習

研究人員利用神經網絡直接學習幾何變換對齊兩幅圖像,而不僅僅侷限於特徵提取。

監督學習

在2016年,DeTone等人發表了 Deep Image Homography Estimation,提出了HomographyNe迴歸網絡,這是一種VGG風格模型,可以學習兩幅相關圖像的單應性。該算法具有以端到端的方式同時學習單應性和CNN模型參數的優勢,不需要前兩個階段的過程!

圖像配準:從SIFT到深度學習

HomographyNet迴歸網絡

網絡產生八個數值作為輸出。以監督的方式進行訓練,並計算輸出和真實單應性之間的歐幾里德損失。

圖像配準:從SIFT到深度學習

Supervised Deep Homography Estimation

與其他有監督方法一樣,該單應性估計方法需要有標記數據。雖然很容易獲得真實圖像的單應性,但在實際數據上要昂貴得多。

無監督學習

基於這個想法,Nguyen等人提出了一種無監督的深度圖像單應性估計方法。他們保留了相同結構的CNN,但是使用適合無監督方法的損失函數:不需要人工標籤的光度損失(photometric loss)函數。相反,它計算參考圖像和感測變換圖像之間的相似性。

"
圖像配準:從SIFT到深度學習

目錄

  • 圖像配準:從SIFT到深度學習
  • 什麼是圖像配準
  • 傳統的基於特徵的方法
  • 關鍵點檢測和特徵描述
  • 特徵匹配
  • 圖像變換
  • 深度學習方法
  • 特徵提取
  • Homography學習
  • 監督學習
  • 無監督學習
  • 其他方法
  • 強化學習
  • 複雜的轉換

圖像配準(Image Registration)是計算機視覺中的基本步驟。在本文中,我們首先介紹基於OpenCV的方法,然後介紹深度學習的方法。

什麼是圖像配準

圖像配準就是找到一幅圖像像素到另一幅圖像像素間的空間映射關係。這些圖像可以是不同時間(多時間配準),不同傳感器在不同地方拍攝(多模式配準)。這些圖像之間的空間關係可以是剛性(rigid)[1](平移和旋轉),仿射(affine)[2](例如剪切),單應性[3](homographies)或複雜的大變形模型(complex large deformations models)。

圖像配準:從SIFT到深度學習

圖像配準具有廣泛的應用,適用於同一個場景中有多張圖像需要進行匹配或疊加。在醫學圖像領域以及衛星圖像分析和光流(optical flow)方面非常普遍。

圖像配準:從SIFT到深度學習

CT掃描和MRI配準

本文我們將介紹圖像配準的幾種不同方法。

傳統的基於特徵的方法

自21世紀初以來,圖像配準主要使用基於特徵的方法。這些方法有三個步驟:關鍵點檢測和特徵描述,特徵匹配,圖像變換。簡單的說,我們選擇兩個圖像中的感興趣點,將參考圖像(reference image)與感測圖像(sensed image)中的等價感興趣點進行關聯,然後變換感測圖像使兩個圖像對齊。

圖像配準:從SIFT到深度學習

基於特徵的方法

關鍵點檢測和特徵描述

關鍵點就是感興趣點,它表示圖像中重要或獨特的內容(邊角,邊緣等)。每個關鍵點由描述符表示,關鍵點基本特徵的特徵向量。描述符應該對圖像變換(定位,縮放,亮度等)具有魯棒性。許多算法使用關鍵點檢測和特徵描述:

  • SIFT[4](Scale-invariant feature transform)是用於關鍵點檢測的原始算法,但它不能免費用於商業用途。SIFT特徵描述符對於均勻縮放,方向,亮度變化和對仿射失真不變的部分不會發生變化。
  • SURF[5](Speeded Up Robust Features)是一個受SIFT啟發的探測器和描述符。它的優點是非常快。它同樣是有專利的。
  • ORB[6](Oriented FAST and Rotated BRIEF)是一種快速的二進制描述符,它基於 FAST[7](Features from Accelerated Segment Test)關鍵點檢測和 BRIEF[8](Binary robust independent elementary features)描述符的組合。它具有旋轉不變性和對噪聲的魯棒性。它由OpenCV實驗室開發,是SIFT有效的免費替代品。
  • AKAZE[9](Accelerated-KAZE)是KAZE[10]快速版本。它為非線性尺度空間[11]提供了快速的多尺度特徵檢測和描述方法,具有縮放和旋轉不變性。

這些算法都可以在OpenCV中輕鬆使用。在下面的例子中,我們使用了AKAZE的OpenCV實現。其他算法的代碼大致相同,只需要修改算法的名稱。

import numpy as np
import cv2 as cv

img = cv.imread('image.jpg')
gray= cv.cvtColor(img, cv.COLOR_BGR2GRAY)

akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)

img=cv.drawKeypoints(gray, kp, img)
cv.imwrite('keypoints.jpg', img)
圖像配準:從SIFT到深度學習

圖像關鍵點

更過關於特徵提取和描述的文檔(https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html)

特徵匹配

一旦在一對圖像中識別出關鍵點,我們就需要將兩個圖像中對應的關鍵點進行關聯或“匹配”。其中一種方法是BFMatcher.knnMatch()。這個方法計算每對關鍵點之間的描述符的距離,並返回每個關鍵點的k個最佳匹配中的最小距離。

然後我們設定比率來保持正確率。實際上,為了使匹配更可靠,匹配的關鍵點需要比最近的錯誤匹配更靠近。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img1 = cv.imread('image1.jpg', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('image2.jpg', cv.IMREAD_GRAYSCALE)

# 初始化 AKAZE 探測器
akaze = cv.AKAZE_create()
# 使用 SIFT 查找關鍵點和描述
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)

# BFMatcher 默認參數
bf = cv.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

# 旋轉測試
good_matches = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good_matches.append([m])

# 畫匹配點
img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,good_matches,None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', img3)
圖像配準:從SIFT到深度學習

匹配的關鍵點

OpenCV中有更多關於特徵匹配的實現方法(https://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html)

圖像變換

在匹配至少四對關鍵點之後,我們就可以將一個圖像轉換為另一個圖像,稱為圖像變換[12](image warping)。空間中相同平面的兩個圖像通過單應性變換[13](Homographies)進行關聯。Homographies是具有8個自由參數的幾何變換,由3x3矩陣表示圖像的整體變換(與局部變換相反)。因此,為了獲得變換後的感測圖像,需要計算Homographies矩陣。

為了得到最佳的變換,我們需要使用RANSAC算法檢測異常值並去除。它內置在OpenCV的findHomography方法中。同時也存在RANSAC算法的替代方案,例如LMEDS: Least-Median魯棒方法。

# 選擇匹配關鍵點
ref_matched_kpts = np.float32([kp1[m[0].queryIdx].pt for m in good_matches]).reshape(-1,1,2)
sensed_matched_kpts = np.float32([kp2[m[0].trainIdx].pt for m in good_matches]).reshape(-1,1,2)

# 計算 homography
H, status = cv.findHomography(ref_matched_kpts, sensed_matched_kpts, cv.RANSAC,5.0)

# 變換
warped_image = cv.warpPerspective(img1, H, (img1.shape[1]+img2.shape[1], img1.shape[0]))

cv.imwrite('warped.jpg', warped_image)
圖像配準:從SIFT到深度學習

變換後的圖像

OpenCV中對這三個步驟進行了綜合敘述(https://docs.opencv.org/3.1.0/db/d27/tutorial_py_table_of_contents_feature2d.html)

深度學習方法

目前大多數關於圖像配準的研究涉及深度學習。在過去的幾年中,深度學習使計算機視覺任務具有先進的性能,如圖像分類,物體檢測和分割。

特徵提取

深度學習用於圖像配準的第一種方式是用於特徵提取。卷積神經網絡設法獲得越來越複雜的圖像特徵並進行學習。2014年以來,研究人員將這些網絡應用於特徵提取的步驟,而不是使用SIFT或類似算法。

  • 2014年,Dosovitskiy等人提出了一種通用的特徵提取方法,使用未標記的數據訓練卷積神經網絡。這些特徵的通用性使轉換具有魯棒性。這些特徵或描述符的性能優於SIFT描述符以匹配任務。
  • 2018年,Yang等人開發了一種基於相同思想的非剛性配準方法。他們使用預訓練的VGG網絡層來生成一個特徵描述符,同時保留卷積信息和局部特徵。這些描述符的性能也優於類似SIFT的探測器,特別是在SIFT包含許多異常值或無法匹配足夠數量特徵點的情況下。
圖像配準:從SIFT到深度學習

SIFT和基於深度學習的非剛性配準方法描述符的結果

Homography學習

研究人員利用神經網絡直接學習幾何變換對齊兩幅圖像,而不僅僅侷限於特徵提取。

監督學習

在2016年,DeTone等人發表了 Deep Image Homography Estimation,提出了HomographyNe迴歸網絡,這是一種VGG風格模型,可以學習兩幅相關圖像的單應性。該算法具有以端到端的方式同時學習單應性和CNN模型參數的優勢,不需要前兩個階段的過程!

圖像配準:從SIFT到深度學習

HomographyNet迴歸網絡

網絡產生八個數值作為輸出。以監督的方式進行訓練,並計算輸出和真實單應性之間的歐幾里德損失。

圖像配準:從SIFT到深度學習

Supervised Deep Homography Estimation

與其他有監督方法一樣,該單應性估計方法需要有標記數據。雖然很容易獲得真實圖像的單應性,但在實際數據上要昂貴得多。

無監督學習

基於這個想法,Nguyen等人提出了一種無監督的深度圖像單應性估計方法。他們保留了相同結構的CNN,但是使用適合無監督方法的損失函數:不需要人工標籤的光度損失(photometric loss)函數。相反,它計算參考圖像和感測變換圖像之間的相似性。

圖像配準:從SIFT到深度學習

L1光度損失函數

他們的方法引入了兩種新的網絡結構:張量直接線性變換和空間變換層。我們可以簡單地使用CNN模型輸出的單應性參數獲得變換後的感測圖像,然後我們使用它們來計算光度損失。

"
圖像配準:從SIFT到深度學習

目錄

  • 圖像配準:從SIFT到深度學習
  • 什麼是圖像配準
  • 傳統的基於特徵的方法
  • 關鍵點檢測和特徵描述
  • 特徵匹配
  • 圖像變換
  • 深度學習方法
  • 特徵提取
  • Homography學習
  • 監督學習
  • 無監督學習
  • 其他方法
  • 強化學習
  • 複雜的轉換

圖像配準(Image Registration)是計算機視覺中的基本步驟。在本文中,我們首先介紹基於OpenCV的方法,然後介紹深度學習的方法。

什麼是圖像配準

圖像配準就是找到一幅圖像像素到另一幅圖像像素間的空間映射關係。這些圖像可以是不同時間(多時間配準),不同傳感器在不同地方拍攝(多模式配準)。這些圖像之間的空間關係可以是剛性(rigid)[1](平移和旋轉),仿射(affine)[2](例如剪切),單應性[3](homographies)或複雜的大變形模型(complex large deformations models)。

圖像配準:從SIFT到深度學習

圖像配準具有廣泛的應用,適用於同一個場景中有多張圖像需要進行匹配或疊加。在醫學圖像領域以及衛星圖像分析和光流(optical flow)方面非常普遍。

圖像配準:從SIFT到深度學習

CT掃描和MRI配準

本文我們將介紹圖像配準的幾種不同方法。

傳統的基於特徵的方法

自21世紀初以來,圖像配準主要使用基於特徵的方法。這些方法有三個步驟:關鍵點檢測和特徵描述,特徵匹配,圖像變換。簡單的說,我們選擇兩個圖像中的感興趣點,將參考圖像(reference image)與感測圖像(sensed image)中的等價感興趣點進行關聯,然後變換感測圖像使兩個圖像對齊。

圖像配準:從SIFT到深度學習

基於特徵的方法

關鍵點檢測和特徵描述

關鍵點就是感興趣點,它表示圖像中重要或獨特的內容(邊角,邊緣等)。每個關鍵點由描述符表示,關鍵點基本特徵的特徵向量。描述符應該對圖像變換(定位,縮放,亮度等)具有魯棒性。許多算法使用關鍵點檢測和特徵描述:

  • SIFT[4](Scale-invariant feature transform)是用於關鍵點檢測的原始算法,但它不能免費用於商業用途。SIFT特徵描述符對於均勻縮放,方向,亮度變化和對仿射失真不變的部分不會發生變化。
  • SURF[5](Speeded Up Robust Features)是一個受SIFT啟發的探測器和描述符。它的優點是非常快。它同樣是有專利的。
  • ORB[6](Oriented FAST and Rotated BRIEF)是一種快速的二進制描述符,它基於 FAST[7](Features from Accelerated Segment Test)關鍵點檢測和 BRIEF[8](Binary robust independent elementary features)描述符的組合。它具有旋轉不變性和對噪聲的魯棒性。它由OpenCV實驗室開發,是SIFT有效的免費替代品。
  • AKAZE[9](Accelerated-KAZE)是KAZE[10]快速版本。它為非線性尺度空間[11]提供了快速的多尺度特徵檢測和描述方法,具有縮放和旋轉不變性。

這些算法都可以在OpenCV中輕鬆使用。在下面的例子中,我們使用了AKAZE的OpenCV實現。其他算法的代碼大致相同,只需要修改算法的名稱。

import numpy as np
import cv2 as cv

img = cv.imread('image.jpg')
gray= cv.cvtColor(img, cv.COLOR_BGR2GRAY)

akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)

img=cv.drawKeypoints(gray, kp, img)
cv.imwrite('keypoints.jpg', img)
圖像配準:從SIFT到深度學習

圖像關鍵點

更過關於特徵提取和描述的文檔(https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html)

特徵匹配

一旦在一對圖像中識別出關鍵點,我們就需要將兩個圖像中對應的關鍵點進行關聯或“匹配”。其中一種方法是BFMatcher.knnMatch()。這個方法計算每對關鍵點之間的描述符的距離,並返回每個關鍵點的k個最佳匹配中的最小距離。

然後我們設定比率來保持正確率。實際上,為了使匹配更可靠,匹配的關鍵點需要比最近的錯誤匹配更靠近。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img1 = cv.imread('image1.jpg', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('image2.jpg', cv.IMREAD_GRAYSCALE)

# 初始化 AKAZE 探測器
akaze = cv.AKAZE_create()
# 使用 SIFT 查找關鍵點和描述
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)

# BFMatcher 默認參數
bf = cv.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

# 旋轉測試
good_matches = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good_matches.append([m])

# 畫匹配點
img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,good_matches,None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', img3)
圖像配準:從SIFT到深度學習

匹配的關鍵點

OpenCV中有更多關於特徵匹配的實現方法(https://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html)

圖像變換

在匹配至少四對關鍵點之後,我們就可以將一個圖像轉換為另一個圖像,稱為圖像變換[12](image warping)。空間中相同平面的兩個圖像通過單應性變換[13](Homographies)進行關聯。Homographies是具有8個自由參數的幾何變換,由3x3矩陣表示圖像的整體變換(與局部變換相反)。因此,為了獲得變換後的感測圖像,需要計算Homographies矩陣。

為了得到最佳的變換,我們需要使用RANSAC算法檢測異常值並去除。它內置在OpenCV的findHomography方法中。同時也存在RANSAC算法的替代方案,例如LMEDS: Least-Median魯棒方法。

# 選擇匹配關鍵點
ref_matched_kpts = np.float32([kp1[m[0].queryIdx].pt for m in good_matches]).reshape(-1,1,2)
sensed_matched_kpts = np.float32([kp2[m[0].trainIdx].pt for m in good_matches]).reshape(-1,1,2)

# 計算 homography
H, status = cv.findHomography(ref_matched_kpts, sensed_matched_kpts, cv.RANSAC,5.0)

# 變換
warped_image = cv.warpPerspective(img1, H, (img1.shape[1]+img2.shape[1], img1.shape[0]))

cv.imwrite('warped.jpg', warped_image)
圖像配準:從SIFT到深度學習

變換後的圖像

OpenCV中對這三個步驟進行了綜合敘述(https://docs.opencv.org/3.1.0/db/d27/tutorial_py_table_of_contents_feature2d.html)

深度學習方法

目前大多數關於圖像配準的研究涉及深度學習。在過去的幾年中,深度學習使計算機視覺任務具有先進的性能,如圖像分類,物體檢測和分割。

特徵提取

深度學習用於圖像配準的第一種方式是用於特徵提取。卷積神經網絡設法獲得越來越複雜的圖像特徵並進行學習。2014年以來,研究人員將這些網絡應用於特徵提取的步驟,而不是使用SIFT或類似算法。

  • 2014年,Dosovitskiy等人提出了一種通用的特徵提取方法,使用未標記的數據訓練卷積神經網絡。這些特徵的通用性使轉換具有魯棒性。這些特徵或描述符的性能優於SIFT描述符以匹配任務。
  • 2018年,Yang等人開發了一種基於相同思想的非剛性配準方法。他們使用預訓練的VGG網絡層來生成一個特徵描述符,同時保留卷積信息和局部特徵。這些描述符的性能也優於類似SIFT的探測器,特別是在SIFT包含許多異常值或無法匹配足夠數量特徵點的情況下。
圖像配準:從SIFT到深度學習

SIFT和基於深度學習的非剛性配準方法描述符的結果

Homography學習

研究人員利用神經網絡直接學習幾何變換對齊兩幅圖像,而不僅僅侷限於特徵提取。

監督學習

在2016年,DeTone等人發表了 Deep Image Homography Estimation,提出了HomographyNe迴歸網絡,這是一種VGG風格模型,可以學習兩幅相關圖像的單應性。該算法具有以端到端的方式同時學習單應性和CNN模型參數的優勢,不需要前兩個階段的過程!

圖像配準:從SIFT到深度學習

HomographyNet迴歸網絡

網絡產生八個數值作為輸出。以監督的方式進行訓練,並計算輸出和真實單應性之間的歐幾里德損失。

圖像配準:從SIFT到深度學習

Supervised Deep Homography Estimation

與其他有監督方法一樣,該單應性估計方法需要有標記數據。雖然很容易獲得真實圖像的單應性,但在實際數據上要昂貴得多。

無監督學習

基於這個想法,Nguyen等人提出了一種無監督的深度圖像單應性估計方法。他們保留了相同結構的CNN,但是使用適合無監督方法的損失函數:不需要人工標籤的光度損失(photometric loss)函數。相反,它計算參考圖像和感測變換圖像之間的相似性。

圖像配準:從SIFT到深度學習

L1光度損失函數

他們的方法引入了兩種新的網絡結構:張量直接線性變換和空間變換層。我們可以簡單地使用CNN模型輸出的單應性參數獲得變換後的感測圖像,然後我們使用它們來計算光度損失。

圖像配準:從SIFT到深度學習

Unsupervised Deep Homography Estimation

作者聲稱,與傳統的基於特徵的方法相比,這種無監督方法具有相當或更高的準確率和魯棒性,並且具有更快的執行速度。此外,與有監督方法相比,它具有更好的適應性和性能。

其他方法

強化學習

強化學習方法作為醫學應用的常用方法正在得到越來越多的關注。與預定義的優化算法相反,在這種方法中,我們使用訓練好的代理進行配準。

"
圖像配準:從SIFT到深度學習

目錄

  • 圖像配準:從SIFT到深度學習
  • 什麼是圖像配準
  • 傳統的基於特徵的方法
  • 關鍵點檢測和特徵描述
  • 特徵匹配
  • 圖像變換
  • 深度學習方法
  • 特徵提取
  • Homography學習
  • 監督學習
  • 無監督學習
  • 其他方法
  • 強化學習
  • 複雜的轉換

圖像配準(Image Registration)是計算機視覺中的基本步驟。在本文中,我們首先介紹基於OpenCV的方法,然後介紹深度學習的方法。

什麼是圖像配準

圖像配準就是找到一幅圖像像素到另一幅圖像像素間的空間映射關係。這些圖像可以是不同時間(多時間配準),不同傳感器在不同地方拍攝(多模式配準)。這些圖像之間的空間關係可以是剛性(rigid)[1](平移和旋轉),仿射(affine)[2](例如剪切),單應性[3](homographies)或複雜的大變形模型(complex large deformations models)。

圖像配準:從SIFT到深度學習

圖像配準具有廣泛的應用,適用於同一個場景中有多張圖像需要進行匹配或疊加。在醫學圖像領域以及衛星圖像分析和光流(optical flow)方面非常普遍。

圖像配準:從SIFT到深度學習

CT掃描和MRI配準

本文我們將介紹圖像配準的幾種不同方法。

傳統的基於特徵的方法

自21世紀初以來,圖像配準主要使用基於特徵的方法。這些方法有三個步驟:關鍵點檢測和特徵描述,特徵匹配,圖像變換。簡單的說,我們選擇兩個圖像中的感興趣點,將參考圖像(reference image)與感測圖像(sensed image)中的等價感興趣點進行關聯,然後變換感測圖像使兩個圖像對齊。

圖像配準:從SIFT到深度學習

基於特徵的方法

關鍵點檢測和特徵描述

關鍵點就是感興趣點,它表示圖像中重要或獨特的內容(邊角,邊緣等)。每個關鍵點由描述符表示,關鍵點基本特徵的特徵向量。描述符應該對圖像變換(定位,縮放,亮度等)具有魯棒性。許多算法使用關鍵點檢測和特徵描述:

  • SIFT[4](Scale-invariant feature transform)是用於關鍵點檢測的原始算法,但它不能免費用於商業用途。SIFT特徵描述符對於均勻縮放,方向,亮度變化和對仿射失真不變的部分不會發生變化。
  • SURF[5](Speeded Up Robust Features)是一個受SIFT啟發的探測器和描述符。它的優點是非常快。它同樣是有專利的。
  • ORB[6](Oriented FAST and Rotated BRIEF)是一種快速的二進制描述符,它基於 FAST[7](Features from Accelerated Segment Test)關鍵點檢測和 BRIEF[8](Binary robust independent elementary features)描述符的組合。它具有旋轉不變性和對噪聲的魯棒性。它由OpenCV實驗室開發,是SIFT有效的免費替代品。
  • AKAZE[9](Accelerated-KAZE)是KAZE[10]快速版本。它為非線性尺度空間[11]提供了快速的多尺度特徵檢測和描述方法,具有縮放和旋轉不變性。

這些算法都可以在OpenCV中輕鬆使用。在下面的例子中,我們使用了AKAZE的OpenCV實現。其他算法的代碼大致相同,只需要修改算法的名稱。

import numpy as np
import cv2 as cv

img = cv.imread('image.jpg')
gray= cv.cvtColor(img, cv.COLOR_BGR2GRAY)

akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)

img=cv.drawKeypoints(gray, kp, img)
cv.imwrite('keypoints.jpg', img)
圖像配準:從SIFT到深度學習

圖像關鍵點

更過關於特徵提取和描述的文檔(https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html)

特徵匹配

一旦在一對圖像中識別出關鍵點,我們就需要將兩個圖像中對應的關鍵點進行關聯或“匹配”。其中一種方法是BFMatcher.knnMatch()。這個方法計算每對關鍵點之間的描述符的距離,並返回每個關鍵點的k個最佳匹配中的最小距離。

然後我們設定比率來保持正確率。實際上,為了使匹配更可靠,匹配的關鍵點需要比最近的錯誤匹配更靠近。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img1 = cv.imread('image1.jpg', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('image2.jpg', cv.IMREAD_GRAYSCALE)

# 初始化 AKAZE 探測器
akaze = cv.AKAZE_create()
# 使用 SIFT 查找關鍵點和描述
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)

# BFMatcher 默認參數
bf = cv.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

# 旋轉測試
good_matches = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good_matches.append([m])

# 畫匹配點
img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,good_matches,None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', img3)
圖像配準:從SIFT到深度學習

匹配的關鍵點

OpenCV中有更多關於特徵匹配的實現方法(https://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html)

圖像變換

在匹配至少四對關鍵點之後,我們就可以將一個圖像轉換為另一個圖像,稱為圖像變換[12](image warping)。空間中相同平面的兩個圖像通過單應性變換[13](Homographies)進行關聯。Homographies是具有8個自由參數的幾何變換,由3x3矩陣表示圖像的整體變換(與局部變換相反)。因此,為了獲得變換後的感測圖像,需要計算Homographies矩陣。

為了得到最佳的變換,我們需要使用RANSAC算法檢測異常值並去除。它內置在OpenCV的findHomography方法中。同時也存在RANSAC算法的替代方案,例如LMEDS: Least-Median魯棒方法。

# 選擇匹配關鍵點
ref_matched_kpts = np.float32([kp1[m[0].queryIdx].pt for m in good_matches]).reshape(-1,1,2)
sensed_matched_kpts = np.float32([kp2[m[0].trainIdx].pt for m in good_matches]).reshape(-1,1,2)

# 計算 homography
H, status = cv.findHomography(ref_matched_kpts, sensed_matched_kpts, cv.RANSAC,5.0)

# 變換
warped_image = cv.warpPerspective(img1, H, (img1.shape[1]+img2.shape[1], img1.shape[0]))

cv.imwrite('warped.jpg', warped_image)
圖像配準:從SIFT到深度學習

變換後的圖像

OpenCV中對這三個步驟進行了綜合敘述(https://docs.opencv.org/3.1.0/db/d27/tutorial_py_table_of_contents_feature2d.html)

深度學習方法

目前大多數關於圖像配準的研究涉及深度學習。在過去的幾年中,深度學習使計算機視覺任務具有先進的性能,如圖像分類,物體檢測和分割。

特徵提取

深度學習用於圖像配準的第一種方式是用於特徵提取。卷積神經網絡設法獲得越來越複雜的圖像特徵並進行學習。2014年以來,研究人員將這些網絡應用於特徵提取的步驟,而不是使用SIFT或類似算法。

  • 2014年,Dosovitskiy等人提出了一種通用的特徵提取方法,使用未標記的數據訓練卷積神經網絡。這些特徵的通用性使轉換具有魯棒性。這些特徵或描述符的性能優於SIFT描述符以匹配任務。
  • 2018年,Yang等人開發了一種基於相同思想的非剛性配準方法。他們使用預訓練的VGG網絡層來生成一個特徵描述符,同時保留卷積信息和局部特徵。這些描述符的性能也優於類似SIFT的探測器,特別是在SIFT包含許多異常值或無法匹配足夠數量特徵點的情況下。
圖像配準:從SIFT到深度學習

SIFT和基於深度學習的非剛性配準方法描述符的結果

Homography學習

研究人員利用神經網絡直接學習幾何變換對齊兩幅圖像,而不僅僅侷限於特徵提取。

監督學習

在2016年,DeTone等人發表了 Deep Image Homography Estimation,提出了HomographyNe迴歸網絡,這是一種VGG風格模型,可以學習兩幅相關圖像的單應性。該算法具有以端到端的方式同時學習單應性和CNN模型參數的優勢,不需要前兩個階段的過程!

圖像配準:從SIFT到深度學習

HomographyNet迴歸網絡

網絡產生八個數值作為輸出。以監督的方式進行訓練,並計算輸出和真實單應性之間的歐幾里德損失。

圖像配準:從SIFT到深度學習

Supervised Deep Homography Estimation

與其他有監督方法一樣,該單應性估計方法需要有標記數據。雖然很容易獲得真實圖像的單應性,但在實際數據上要昂貴得多。

無監督學習

基於這個想法,Nguyen等人提出了一種無監督的深度圖像單應性估計方法。他們保留了相同結構的CNN,但是使用適合無監督方法的損失函數:不需要人工標籤的光度損失(photometric loss)函數。相反,它計算參考圖像和感測變換圖像之間的相似性。

圖像配準:從SIFT到深度學習

L1光度損失函數

他們的方法引入了兩種新的網絡結構:張量直接線性變換和空間變換層。我們可以簡單地使用CNN模型輸出的單應性參數獲得變換後的感測圖像,然後我們使用它們來計算光度損失。

圖像配準:從SIFT到深度學習

Unsupervised Deep Homography Estimation

作者聲稱,與傳統的基於特徵的方法相比,這種無監督方法具有相當或更高的準確率和魯棒性,並且具有更快的執行速度。此外,與有監督方法相比,它具有更好的適應性和性能。

其他方法

強化學習

強化學習方法作為醫學應用的常用方法正在得到越來越多的關注。與預定義的優化算法相反,在這種方法中,我們使用訓練好的代理進行配準。

圖像配準:從SIFT到深度學習

強化學習方法的配準可視化

  • 2016年,Liao 等人首先使用強化學習進行圖像配準。他們的方法基於有監督算法進行端到端的訓練。它的目標是通過尋找最佳的運動動作序列來對齊圖像。這種方法優於最先進的方法,但它只能用於剛性轉換。
  • 強化學習也可以用於更復雜的轉換。在Robust non-rigid registration through agent-based action learning論文中,Krebs等人使用人工代理優化變形模型參數。該方法對前列腺MRI圖像的患者間的配準進行實驗,在2-D和3-D中表現出了較好的結果。

複雜的轉換

在當前圖像配準研究中佔較大比例的是醫學影像。通常,由於患者的局部變形(因呼吸,解剖學變化等),兩個醫學圖像之間的變換不能簡單地通過單應矩陣描述,這需要更復雜的變換模型,例如由位移矢量場表示微分同胚(diffeomorphisms)。

"
圖像配準:從SIFT到深度學習

目錄

  • 圖像配準:從SIFT到深度學習
  • 什麼是圖像配準
  • 傳統的基於特徵的方法
  • 關鍵點檢測和特徵描述
  • 特徵匹配
  • 圖像變換
  • 深度學習方法
  • 特徵提取
  • Homography學習
  • 監督學習
  • 無監督學習
  • 其他方法
  • 強化學習
  • 複雜的轉換

圖像配準(Image Registration)是計算機視覺中的基本步驟。在本文中,我們首先介紹基於OpenCV的方法,然後介紹深度學習的方法。

什麼是圖像配準

圖像配準就是找到一幅圖像像素到另一幅圖像像素間的空間映射關係。這些圖像可以是不同時間(多時間配準),不同傳感器在不同地方拍攝(多模式配準)。這些圖像之間的空間關係可以是剛性(rigid)[1](平移和旋轉),仿射(affine)[2](例如剪切),單應性[3](homographies)或複雜的大變形模型(complex large deformations models)。

圖像配準:從SIFT到深度學習

圖像配準具有廣泛的應用,適用於同一個場景中有多張圖像需要進行匹配或疊加。在醫學圖像領域以及衛星圖像分析和光流(optical flow)方面非常普遍。

圖像配準:從SIFT到深度學習

CT掃描和MRI配準

本文我們將介紹圖像配準的幾種不同方法。

傳統的基於特徵的方法

自21世紀初以來,圖像配準主要使用基於特徵的方法。這些方法有三個步驟:關鍵點檢測和特徵描述,特徵匹配,圖像變換。簡單的說,我們選擇兩個圖像中的感興趣點,將參考圖像(reference image)與感測圖像(sensed image)中的等價感興趣點進行關聯,然後變換感測圖像使兩個圖像對齊。

圖像配準:從SIFT到深度學習

基於特徵的方法

關鍵點檢測和特徵描述

關鍵點就是感興趣點,它表示圖像中重要或獨特的內容(邊角,邊緣等)。每個關鍵點由描述符表示,關鍵點基本特徵的特徵向量。描述符應該對圖像變換(定位,縮放,亮度等)具有魯棒性。許多算法使用關鍵點檢測和特徵描述:

  • SIFT[4](Scale-invariant feature transform)是用於關鍵點檢測的原始算法,但它不能免費用於商業用途。SIFT特徵描述符對於均勻縮放,方向,亮度變化和對仿射失真不變的部分不會發生變化。
  • SURF[5](Speeded Up Robust Features)是一個受SIFT啟發的探測器和描述符。它的優點是非常快。它同樣是有專利的。
  • ORB[6](Oriented FAST and Rotated BRIEF)是一種快速的二進制描述符,它基於 FAST[7](Features from Accelerated Segment Test)關鍵點檢測和 BRIEF[8](Binary robust independent elementary features)描述符的組合。它具有旋轉不變性和對噪聲的魯棒性。它由OpenCV實驗室開發,是SIFT有效的免費替代品。
  • AKAZE[9](Accelerated-KAZE)是KAZE[10]快速版本。它為非線性尺度空間[11]提供了快速的多尺度特徵檢測和描述方法,具有縮放和旋轉不變性。

這些算法都可以在OpenCV中輕鬆使用。在下面的例子中,我們使用了AKAZE的OpenCV實現。其他算法的代碼大致相同,只需要修改算法的名稱。

import numpy as np
import cv2 as cv

img = cv.imread('image.jpg')
gray= cv.cvtColor(img, cv.COLOR_BGR2GRAY)

akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)

img=cv.drawKeypoints(gray, kp, img)
cv.imwrite('keypoints.jpg', img)
圖像配準:從SIFT到深度學習

圖像關鍵點

更過關於特徵提取和描述的文檔(https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html)

特徵匹配

一旦在一對圖像中識別出關鍵點,我們就需要將兩個圖像中對應的關鍵點進行關聯或“匹配”。其中一種方法是BFMatcher.knnMatch()。這個方法計算每對關鍵點之間的描述符的距離,並返回每個關鍵點的k個最佳匹配中的最小距離。

然後我們設定比率來保持正確率。實際上,為了使匹配更可靠,匹配的關鍵點需要比最近的錯誤匹配更靠近。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img1 = cv.imread('image1.jpg', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('image2.jpg', cv.IMREAD_GRAYSCALE)

# 初始化 AKAZE 探測器
akaze = cv.AKAZE_create()
# 使用 SIFT 查找關鍵點和描述
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)

# BFMatcher 默認參數
bf = cv.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

# 旋轉測試
good_matches = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good_matches.append([m])

# 畫匹配點
img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,good_matches,None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', img3)
圖像配準:從SIFT到深度學習

匹配的關鍵點

OpenCV中有更多關於特徵匹配的實現方法(https://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html)

圖像變換

在匹配至少四對關鍵點之後,我們就可以將一個圖像轉換為另一個圖像,稱為圖像變換[12](image warping)。空間中相同平面的兩個圖像通過單應性變換[13](Homographies)進行關聯。Homographies是具有8個自由參數的幾何變換,由3x3矩陣表示圖像的整體變換(與局部變換相反)。因此,為了獲得變換後的感測圖像,需要計算Homographies矩陣。

為了得到最佳的變換,我們需要使用RANSAC算法檢測異常值並去除。它內置在OpenCV的findHomography方法中。同時也存在RANSAC算法的替代方案,例如LMEDS: Least-Median魯棒方法。

# 選擇匹配關鍵點
ref_matched_kpts = np.float32([kp1[m[0].queryIdx].pt for m in good_matches]).reshape(-1,1,2)
sensed_matched_kpts = np.float32([kp2[m[0].trainIdx].pt for m in good_matches]).reshape(-1,1,2)

# 計算 homography
H, status = cv.findHomography(ref_matched_kpts, sensed_matched_kpts, cv.RANSAC,5.0)

# 變換
warped_image = cv.warpPerspective(img1, H, (img1.shape[1]+img2.shape[1], img1.shape[0]))

cv.imwrite('warped.jpg', warped_image)
圖像配準:從SIFT到深度學習

變換後的圖像

OpenCV中對這三個步驟進行了綜合敘述(https://docs.opencv.org/3.1.0/db/d27/tutorial_py_table_of_contents_feature2d.html)

深度學習方法

目前大多數關於圖像配準的研究涉及深度學習。在過去的幾年中,深度學習使計算機視覺任務具有先進的性能,如圖像分類,物體檢測和分割。

特徵提取

深度學習用於圖像配準的第一種方式是用於特徵提取。卷積神經網絡設法獲得越來越複雜的圖像特徵並進行學習。2014年以來,研究人員將這些網絡應用於特徵提取的步驟,而不是使用SIFT或類似算法。

  • 2014年,Dosovitskiy等人提出了一種通用的特徵提取方法,使用未標記的數據訓練卷積神經網絡。這些特徵的通用性使轉換具有魯棒性。這些特徵或描述符的性能優於SIFT描述符以匹配任務。
  • 2018年,Yang等人開發了一種基於相同思想的非剛性配準方法。他們使用預訓練的VGG網絡層來生成一個特徵描述符,同時保留卷積信息和局部特徵。這些描述符的性能也優於類似SIFT的探測器,特別是在SIFT包含許多異常值或無法匹配足夠數量特徵點的情況下。
圖像配準:從SIFT到深度學習

SIFT和基於深度學習的非剛性配準方法描述符的結果

Homography學習

研究人員利用神經網絡直接學習幾何變換對齊兩幅圖像,而不僅僅侷限於特徵提取。

監督學習

在2016年,DeTone等人發表了 Deep Image Homography Estimation,提出了HomographyNe迴歸網絡,這是一種VGG風格模型,可以學習兩幅相關圖像的單應性。該算法具有以端到端的方式同時學習單應性和CNN模型參數的優勢,不需要前兩個階段的過程!

圖像配準:從SIFT到深度學習

HomographyNet迴歸網絡

網絡產生八個數值作為輸出。以監督的方式進行訓練,並計算輸出和真實單應性之間的歐幾里德損失。

圖像配準:從SIFT到深度學習

Supervised Deep Homography Estimation

與其他有監督方法一樣,該單應性估計方法需要有標記數據。雖然很容易獲得真實圖像的單應性,但在實際數據上要昂貴得多。

無監督學習

基於這個想法,Nguyen等人提出了一種無監督的深度圖像單應性估計方法。他們保留了相同結構的CNN,但是使用適合無監督方法的損失函數:不需要人工標籤的光度損失(photometric loss)函數。相反,它計算參考圖像和感測變換圖像之間的相似性。

圖像配準:從SIFT到深度學習

L1光度損失函數

他們的方法引入了兩種新的網絡結構:張量直接線性變換和空間變換層。我們可以簡單地使用CNN模型輸出的單應性參數獲得變換後的感測圖像,然後我們使用它們來計算光度損失。

圖像配準:從SIFT到深度學習

Unsupervised Deep Homography Estimation

作者聲稱,與傳統的基於特徵的方法相比,這種無監督方法具有相當或更高的準確率和魯棒性,並且具有更快的執行速度。此外,與有監督方法相比,它具有更好的適應性和性能。

其他方法

強化學習

強化學習方法作為醫學應用的常用方法正在得到越來越多的關注。與預定義的優化算法相反,在這種方法中,我們使用訓練好的代理進行配準。

圖像配準:從SIFT到深度學習

強化學習方法的配準可視化

  • 2016年,Liao 等人首先使用強化學習進行圖像配準。他們的方法基於有監督算法進行端到端的訓練。它的目標是通過尋找最佳的運動動作序列來對齊圖像。這種方法優於最先進的方法,但它只能用於剛性轉換。
  • 強化學習也可以用於更復雜的轉換。在Robust non-rigid registration through agent-based action learning論文中,Krebs等人使用人工代理優化變形模型參數。該方法對前列腺MRI圖像的患者間的配準進行實驗,在2-D和3-D中表現出了較好的結果。

複雜的轉換

在當前圖像配準研究中佔較大比例的是醫學影像。通常,由於患者的局部變形(因呼吸,解剖學變化等),兩個醫學圖像之間的變換不能簡單地通過單應矩陣描述,這需要更復雜的變換模型,例如由位移矢量場表示微分同胚(diffeomorphisms)。

圖像配準:從SIFT到深度學習

心臟MRI圖像上的變形網格和位移矢量場示例

研究人員開始嘗試使用神經網絡來估計這些具有許多參數的大變形模型。

  • 一個例子是上面提到的Krebs等人的強化學習方法。
  • 2017年De Vos等人提出了DIRNet。它使用CNN來預測控制點網格,該控制點用於生成位移矢量場,然後根據參考圖像變換感測圖像。
"
圖像配準:從SIFT到深度學習

目錄

  • 圖像配準:從SIFT到深度學習
  • 什麼是圖像配準
  • 傳統的基於特徵的方法
  • 關鍵點檢測和特徵描述
  • 特徵匹配
  • 圖像變換
  • 深度學習方法
  • 特徵提取
  • Homography學習
  • 監督學習
  • 無監督學習
  • 其他方法
  • 強化學習
  • 複雜的轉換

圖像配準(Image Registration)是計算機視覺中的基本步驟。在本文中,我們首先介紹基於OpenCV的方法,然後介紹深度學習的方法。

什麼是圖像配準

圖像配準就是找到一幅圖像像素到另一幅圖像像素間的空間映射關係。這些圖像可以是不同時間(多時間配準),不同傳感器在不同地方拍攝(多模式配準)。這些圖像之間的空間關係可以是剛性(rigid)[1](平移和旋轉),仿射(affine)[2](例如剪切),單應性[3](homographies)或複雜的大變形模型(complex large deformations models)。

圖像配準:從SIFT到深度學習

圖像配準具有廣泛的應用,適用於同一個場景中有多張圖像需要進行匹配或疊加。在醫學圖像領域以及衛星圖像分析和光流(optical flow)方面非常普遍。

圖像配準:從SIFT到深度學習

CT掃描和MRI配準

本文我們將介紹圖像配準的幾種不同方法。

傳統的基於特徵的方法

自21世紀初以來,圖像配準主要使用基於特徵的方法。這些方法有三個步驟:關鍵點檢測和特徵描述,特徵匹配,圖像變換。簡單的說,我們選擇兩個圖像中的感興趣點,將參考圖像(reference image)與感測圖像(sensed image)中的等價感興趣點進行關聯,然後變換感測圖像使兩個圖像對齊。

圖像配準:從SIFT到深度學習

基於特徵的方法

關鍵點檢測和特徵描述

關鍵點就是感興趣點,它表示圖像中重要或獨特的內容(邊角,邊緣等)。每個關鍵點由描述符表示,關鍵點基本特徵的特徵向量。描述符應該對圖像變換(定位,縮放,亮度等)具有魯棒性。許多算法使用關鍵點檢測和特徵描述:

  • SIFT[4](Scale-invariant feature transform)是用於關鍵點檢測的原始算法,但它不能免費用於商業用途。SIFT特徵描述符對於均勻縮放,方向,亮度變化和對仿射失真不變的部分不會發生變化。
  • SURF[5](Speeded Up Robust Features)是一個受SIFT啟發的探測器和描述符。它的優點是非常快。它同樣是有專利的。
  • ORB[6](Oriented FAST and Rotated BRIEF)是一種快速的二進制描述符,它基於 FAST[7](Features from Accelerated Segment Test)關鍵點檢測和 BRIEF[8](Binary robust independent elementary features)描述符的組合。它具有旋轉不變性和對噪聲的魯棒性。它由OpenCV實驗室開發,是SIFT有效的免費替代品。
  • AKAZE[9](Accelerated-KAZE)是KAZE[10]快速版本。它為非線性尺度空間[11]提供了快速的多尺度特徵檢測和描述方法,具有縮放和旋轉不變性。

這些算法都可以在OpenCV中輕鬆使用。在下面的例子中,我們使用了AKAZE的OpenCV實現。其他算法的代碼大致相同,只需要修改算法的名稱。

import numpy as np
import cv2 as cv

img = cv.imread('image.jpg')
gray= cv.cvtColor(img, cv.COLOR_BGR2GRAY)

akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)

img=cv.drawKeypoints(gray, kp, img)
cv.imwrite('keypoints.jpg', img)
圖像配準:從SIFT到深度學習

圖像關鍵點

更過關於特徵提取和描述的文檔(https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html)

特徵匹配

一旦在一對圖像中識別出關鍵點,我們就需要將兩個圖像中對應的關鍵點進行關聯或“匹配”。其中一種方法是BFMatcher.knnMatch()。這個方法計算每對關鍵點之間的描述符的距離,並返回每個關鍵點的k個最佳匹配中的最小距離。

然後我們設定比率來保持正確率。實際上,為了使匹配更可靠,匹配的關鍵點需要比最近的錯誤匹配更靠近。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img1 = cv.imread('image1.jpg', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('image2.jpg', cv.IMREAD_GRAYSCALE)

# 初始化 AKAZE 探測器
akaze = cv.AKAZE_create()
# 使用 SIFT 查找關鍵點和描述
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)

# BFMatcher 默認參數
bf = cv.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

# 旋轉測試
good_matches = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good_matches.append([m])

# 畫匹配點
img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,good_matches,None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', img3)
圖像配準:從SIFT到深度學習

匹配的關鍵點

OpenCV中有更多關於特徵匹配的實現方法(https://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html)

圖像變換

在匹配至少四對關鍵點之後,我們就可以將一個圖像轉換為另一個圖像,稱為圖像變換[12](image warping)。空間中相同平面的兩個圖像通過單應性變換[13](Homographies)進行關聯。Homographies是具有8個自由參數的幾何變換,由3x3矩陣表示圖像的整體變換(與局部變換相反)。因此,為了獲得變換後的感測圖像,需要計算Homographies矩陣。

為了得到最佳的變換,我們需要使用RANSAC算法檢測異常值並去除。它內置在OpenCV的findHomography方法中。同時也存在RANSAC算法的替代方案,例如LMEDS: Least-Median魯棒方法。

# 選擇匹配關鍵點
ref_matched_kpts = np.float32([kp1[m[0].queryIdx].pt for m in good_matches]).reshape(-1,1,2)
sensed_matched_kpts = np.float32([kp2[m[0].trainIdx].pt for m in good_matches]).reshape(-1,1,2)

# 計算 homography
H, status = cv.findHomography(ref_matched_kpts, sensed_matched_kpts, cv.RANSAC,5.0)

# 變換
warped_image = cv.warpPerspective(img1, H, (img1.shape[1]+img2.shape[1], img1.shape[0]))

cv.imwrite('warped.jpg', warped_image)
圖像配準:從SIFT到深度學習

變換後的圖像

OpenCV中對這三個步驟進行了綜合敘述(https://docs.opencv.org/3.1.0/db/d27/tutorial_py_table_of_contents_feature2d.html)

深度學習方法

目前大多數關於圖像配準的研究涉及深度學習。在過去的幾年中,深度學習使計算機視覺任務具有先進的性能,如圖像分類,物體檢測和分割。

特徵提取

深度學習用於圖像配準的第一種方式是用於特徵提取。卷積神經網絡設法獲得越來越複雜的圖像特徵並進行學習。2014年以來,研究人員將這些網絡應用於特徵提取的步驟,而不是使用SIFT或類似算法。

  • 2014年,Dosovitskiy等人提出了一種通用的特徵提取方法,使用未標記的數據訓練卷積神經網絡。這些特徵的通用性使轉換具有魯棒性。這些特徵或描述符的性能優於SIFT描述符以匹配任務。
  • 2018年,Yang等人開發了一種基於相同思想的非剛性配準方法。他們使用預訓練的VGG網絡層來生成一個特徵描述符,同時保留卷積信息和局部特徵。這些描述符的性能也優於類似SIFT的探測器,特別是在SIFT包含許多異常值或無法匹配足夠數量特徵點的情況下。
圖像配準:從SIFT到深度學習

SIFT和基於深度學習的非剛性配準方法描述符的結果

Homography學習

研究人員利用神經網絡直接學習幾何變換對齊兩幅圖像,而不僅僅侷限於特徵提取。

監督學習

在2016年,DeTone等人發表了 Deep Image Homography Estimation,提出了HomographyNe迴歸網絡,這是一種VGG風格模型,可以學習兩幅相關圖像的單應性。該算法具有以端到端的方式同時學習單應性和CNN模型參數的優勢,不需要前兩個階段的過程!

圖像配準:從SIFT到深度學習

HomographyNet迴歸網絡

網絡產生八個數值作為輸出。以監督的方式進行訓練,並計算輸出和真實單應性之間的歐幾里德損失。

圖像配準:從SIFT到深度學習

Supervised Deep Homography Estimation

與其他有監督方法一樣,該單應性估計方法需要有標記數據。雖然很容易獲得真實圖像的單應性,但在實際數據上要昂貴得多。

無監督學習

基於這個想法,Nguyen等人提出了一種無監督的深度圖像單應性估計方法。他們保留了相同結構的CNN,但是使用適合無監督方法的損失函數:不需要人工標籤的光度損失(photometric loss)函數。相反,它計算參考圖像和感測變換圖像之間的相似性。

圖像配準:從SIFT到深度學習

L1光度損失函數

他們的方法引入了兩種新的網絡結構:張量直接線性變換和空間變換層。我們可以簡單地使用CNN模型輸出的單應性參數獲得變換後的感測圖像,然後我們使用它們來計算光度損失。

圖像配準:從SIFT到深度學習

Unsupervised Deep Homography Estimation

作者聲稱,與傳統的基於特徵的方法相比,這種無監督方法具有相當或更高的準確率和魯棒性,並且具有更快的執行速度。此外,與有監督方法相比,它具有更好的適應性和性能。

其他方法

強化學習

強化學習方法作為醫學應用的常用方法正在得到越來越多的關注。與預定義的優化算法相反,在這種方法中,我們使用訓練好的代理進行配準。

圖像配準:從SIFT到深度學習

強化學習方法的配準可視化

  • 2016年,Liao 等人首先使用強化學習進行圖像配準。他們的方法基於有監督算法進行端到端的訓練。它的目標是通過尋找最佳的運動動作序列來對齊圖像。這種方法優於最先進的方法,但它只能用於剛性轉換。
  • 強化學習也可以用於更復雜的轉換。在Robust non-rigid registration through agent-based action learning論文中,Krebs等人使用人工代理優化變形模型參數。該方法對前列腺MRI圖像的患者間的配準進行實驗,在2-D和3-D中表現出了較好的結果。

複雜的轉換

在當前圖像配準研究中佔較大比例的是醫學影像。通常,由於患者的局部變形(因呼吸,解剖學變化等),兩個醫學圖像之間的變換不能簡單地通過單應矩陣描述,這需要更復雜的變換模型,例如由位移矢量場表示微分同胚(diffeomorphisms)。

圖像配準:從SIFT到深度學習

心臟MRI圖像上的變形網格和位移矢量場示例

研究人員開始嘗試使用神經網絡來估計這些具有許多參數的大變形模型。

  • 一個例子是上面提到的Krebs等人的強化學習方法。
  • 2017年De Vos等人提出了DIRNet。它使用CNN來預測控制點網格,該控制點用於生成位移矢量場,然後根據參考圖像變換感測圖像。
圖像配準:從SIFT到深度學習

來自MNIST兩個輸入圖像的DIRNet示意圖

  • Quicksilver配準解決了類似的問題。Quicksilver使用深度編碼-解碼器網絡直接在預測圖像上進行變形。

[1]: https://en.wikipedia.org/wiki/Rigid_transformation

[2]: https://en.wikipedia.org/wiki/Affine_transformation

[3]: https://docs.opencv.org/3.4.1/d9/dab/tutorial_homography.html

[4]: https://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf

[5]: https://www.vision.ee.ethz.ch/~surf/eccv06.pdf

[6]: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.370.4395&rep=rep1&type=pdf

[7]: https://www.edwardrosten.com/work/rosten_2006_machine.pdf

[8]: https://www.cs.ubc.ca/~lowe/525/papers/calonder_eccv10.pdf

[9]: http://www.bmva.org/bmvc/2013/Papers/paper0013/paper0013.pdf

[10]: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.304.4980&rep=rep1&type=pdf

[11]: https://en.wikipedia.org/wiki/Scale_space

[12]: https://docs.opencv.org/3.0-beta/modules/cudawarping/doc/warping.html

[13]: https://docs.opencv.org/3.4.1/d9/dab/tutorial_homography.html

"

相關推薦

推薦中...