本篇關(guān)于之前做的一個(gè)project的具體實(shí)現(xiàn)。常有一種遺憾,遇到很美的風(fēng)景而你的鏡頭卻不能全部將它收入“眼底”。現(xiàn)在許多手機(jī)上都有了全景模式,這個(gè)功能在一定程度上緩解了問題,但對(duì)于有些的同學(xué)比如說我依然會(huì)拍出“抖動(dòng)”嚴(yán)重的畫面。今天我要介紹的這個(gè)project就可以將多個(gè)單張不同角度的風(fēng)景拼成一張大圖。
效果如下:
首先使用Harris Corner特征檢測器和sift描述符檢測圖像中的特征,并在其他圖像中找到最佳匹配特征; 然后使用RANSAC 對(duì)齊照片(確定它們的重疊和相對(duì)位置),最后將生成的圖像拼接到一個(gè)無縫的全景圖中。
多張單圖:
全景圖:
首先基本步驟為:
- 進(jìn)行角點(diǎn)檢測,本文中將使用Harris corner detector方法進(jìn)行角點(diǎn)檢測。
- 進(jìn)行興趣點(diǎn)描述,構(gòu)建sift descriptor。
- 兩張圖片之間進(jìn)行興趣點(diǎn)匹配
- 利用Ransac算法計(jì)算兩張圖片之間的homography(H矩陣)
- 根據(jù)H變換圖片并將兩張圖片拼接在一起。
- 多次運(yùn)行以上步驟,將所有圖片進(jìn)行拼接,最后獲得全景圖。
具體步驟:
Step1. Harris corner角點(diǎn)檢測
A.計(jì)算圖像x,y方向上的導(dǎo)數(shù)。
B.計(jì)算圖像導(dǎo)數(shù)的協(xié)方差矩陣H。
H=
通常,在計(jì)算協(xié)方差矩陣時(shí),計(jì)算窗口或圖像的小區(qū)域上的,和之和。為了獲得更好的角點(diǎn)檢測結(jié)果可以使用高斯加權(quán)窗口。使用det(H)/trace(H),其中det(H)為 計(jì)算每個(gè)點(diǎn)的Harris響應(yīng)值。設(shè)置閾值找到并存儲(chǔ)興趣點(diǎn)位置。
code:
def detectKeypoints(image):
#接收?qǐng)D像
image = image.astype(np.float32)
image /= 255.
height, width = image.shape[:2]
features = []
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#轉(zhuǎn)換成灰度圖 計(jì)算Harris值
harrisImage, orientationImage = computeHarrisValues(grayImage)
#harrisImage=[harrisImage>np.average(harrisImage)]
#應(yīng)用LocalMaxima算法進(jìn)行特征篩選
harrisMaxImage =computeLocalMaxima(harrisImage)
#設(shè)置threshold將特征值進(jìn)一步過濾,興趣點(diǎn)數(shù)量進(jìn)一步減少
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
結(jié)果展示:
-
檢測器
+關(guān)注
關(guān)注
1文章
857瀏覽量
47624 -
圖像
+關(guān)注
關(guān)注
2文章
1078瀏覽量
40375 -
Sift
+關(guān)注
關(guān)注
1文章
38瀏覽量
15045
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論