本篇关于之前做的一个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文章
947浏览量
50117 -
图像
+关注
关注
2文章
1096浏览量
42438 -
Sift
+关注
关注
1文章
38浏览量
15618
发布评论请先 登录
相关推荐
热点推荐
用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
评论