本篇關于之前做的一個project的具體實現。常有一種遺憾,遇到很美的風景而你的鏡頭卻不能全部將它收入“眼底”。現在許多手機上都有了全景模式,這個功能在一定程度上緩解了問題,但對于有些的同學比如說我依然會拍出“抖動”嚴重的畫面。今天我要介紹的這個project就可以將多個單張不同角度的風景拼成一張大圖。
效果如下:
首先使用Harris Corner特征檢測器和sift描述符檢測圖像中的特征,并在其他圖像中找到最佳匹配特征; 然后使用RANSAC 對齊照片(確定它們的重疊和相對位置),最后將生成的圖像拼接到一個無縫的全景圖中。
多張單圖:






全景圖:

首先基本步驟為:
- 進行角點檢測,本文中將使用Harris corner detector方法進行角點檢測。
- 進行興趣點描述,構建sift descriptor。
- 兩張圖片之間進行興趣點匹配
- 利用Ransac算法計算兩張圖片之間的homography(H矩陣)
- 根據H變換圖片并將兩張圖片拼接在一起。
- 多次運行以上步驟,將所有圖片進行拼接,最后獲得全景圖。
具體步驟:
Step1. Harris corner角點檢測
A.計算圖像x,y方向上的導數。
B.計算圖像導數的協方差矩陣H。
H= 
通常,在計算協方差矩陣時,計算窗口或圖像的小區域上的
,
和
之和。為了獲得更好的角點檢測結果可以使用高斯加權窗口。使用det(H)/trace(H),其中det(H)為 計算每個點的Harris響應值。設置閾值找到并存儲興趣點位置。
code:
def detectKeypoints(image):
#接收圖像
image = image.astype(np.float32)
image /= 255.
height, width = image.shape[:2]
features = []
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#轉換成灰度圖 計算Harris值
harrisImage, orientationImage = computeHarrisValues(grayImage)
#harrisImage=[harrisImage>np.average(harrisImage)]
#應用LocalMaxima算法進行特征篩選
harrisMaxImage =computeLocalMaxima(harrisImage)
#設置threshold將特征值進一步過濾,興趣點數量進一步減少
threhold = 0.01*np.max(harrisImage)
for y in range(height):
for x in range(width):
if not harrisMaxImage[y, x]:
continue
f = cv2.KeyPoint()
f.size = 10
f.angle = orientationImage[y,x]
f.pt = (x,y)
f.response = harrisImage[y,x]
if(f.response>threhold):
features.append(f)
return features
Harris corner的部分
def computeHarrisValues(Image):
height, width = Image.shape[:2]
harrisImage = np.zeros(Image.shape[:2], dtype=float)
orientationImage = np.zeros(Image.shape[:2], dtype=float)
sobx = np.zeros(Image.shape[:2], dtype=float)
filters.sobel(Image, 1, sobx)
soby = np.zeros(Image.shape[:2], dtype=float)
filters.sobel(Image, 0, soby)
# sobx = filters.convolve(srcImage,sx,mode='reflect')
# soby = filters.convolve(srcImage,sy,mode='reflect')
Ix = sobx*sobx
Iy = soby*soby
Ixy = sobx*soby
Wxx = filters.gaussian_filter(Ix,sigma=0.5)
Wyy = filters.gaussian_filter(Iy,sigma=0.5)
Wxy = filters.gaussian_filter(Ixy,sigma=0.5)
harrisImage = Wxx*Wyy - Wxy*Wxy - 0.1*(Wxx+Wyy)*(Wxx+Wyy)
orientationImage = np.arctan2(soby,sobx)*(180) / np.pi
return harrisImage, orientationImage
結果展示:


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
檢測器
+關注
關注
1文章
931瀏覽量
49933 -
圖像
+關注
關注
2文章
1096瀏覽量
42326 -
Sift
+關注
關注
1文章
38瀏覽量
15594
發布評論請先 登錄
相關推薦
熱點推薦
用ADE XLall跑all Corner時 第一個Corner為什么總是會報錯?
在用 ADE XL仿真出現一個error ERRO ID:5010在用 ADE XLall 跑all Corner 的時候,第一個Corner總是會報錯。不知道怎么回事,outputl
發表于 06-25 06:04
Harris加快信號處理FPGA驗證
Harris公司的工程師們經常在緊迫的時限內交付基于FPGA的復雜信號處理系統。為了滿足客戶時常十分嚴格的要求以及自身的質量標準,工程師們會在綜合各個系統前徹底驗證HDL設計。 在過去,HDL驗證需要多步手工操作現在,Harris工程師們使用EDASimulatoLink
發表于 03-15 15:36
?13次下載
FPGA中的fast corner和slow corner介紹
在FPGA的時序分析頁面,我們經常會看到`Max at Slow Process Corner`和`Min at Fast Process Corner`,具體是什么含義呢?
UltraEM?的Corner Sweep仿真實例
UltraEM可以使用Corner Sweep來仿真工藝變化對器件結構造成的影響,具體包含三種仿真模式:MonteCarlo仿真、Perturbation仿真與Corner仿真。
Python實現OpenCV的安裝與使用
本文實例講述了 Python 實現 OpenCV 的安裝與使用。分享給大家供 大家參考,具體如下: 由于下一步要開始研究下深度學習,而深度學習領域很多的算法和應 用都是用 Python
發表于 07-20 11:46
?7次下載
TinyDB :一個純Python編寫的輕量級數據庫
TinyDB 是一個純 Python 編寫的輕量級數據庫,一共只有1800行代碼,沒有外部依賴項。 TinyDB的目標是降低小型 Python
芯片后端signoff的RC corner指什么?
今天想聊一聊STA相關的RC corner的問題。我先簡單介紹一些什么是signoff的corner,然后重點聊一聊RC
如何實現Python復制文件操作
Python 中有許多“開蓋即食”的模塊(比如 os,subprocess 和 shutil)以支持文件 I/O 操作。在這篇文章中,你將會看到一些用 Python 實現文件復制的特殊
IBIS模型中的Corner參數處理
本文聚焦IBIS(I/O Buffer Information Specification)模型中的Corner(Typ/Min/Max)參數處理,系統分析Corner的定義規則及其對信號完整性
純python實現(一)Harris corner
評論