本篇关于之前做的一个project的具体实现。常有一种遗憾,遇到很美的风景而你的镜头却不能全部将它收入“眼底”。现在许多手机上都有了全景模式,这个功能在一定程度上缓解了问题,但对于有些的同学比如说我依然会拍出“抖动”严重的画面。今天我要介绍的这个project就可以将多个单张不同角度的风景拼成一张大图。
效果如下:
首先使用Harris Corner特征检测器和sift描述符检测图像中的特征,并在其他图像中找到最佳匹配特征; 然后使用RANSAC 对齐照片(确定它们的重叠和相对位置),最后将生成的图像拼接到一个无缝的全景图中。
多张单图:
全景图:
首先基本步骤为:
具体步骤:
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
结果展示:
全部0条评论
快来发表一下你的评论吧 !