利用Python实现图像拼接
利用python语言实现多张图像拼接_小饼干cookie的博客-CSDN博客_python拼接图像
主要参考上述博文,只是对于复现过程遇到的小问题的解决做一些补充。
拼接程序:
from pylab import *
from numpy import *
from PIL import Image# If you have PCV installed, these imports should work
from PCV.geometry import homography, warp
from PCV.localdescriptors import sift"""
This is the panorama example from section 3.3.
"""featname = ['D:/pythonCode/test/data/testimages/' + str(i + 1) + '.sift' for i in range(5)] //需要根据自己的图像地址和图像数量修改地址和循环次数
imname = ['D:/pythonCode/test/data/testimages/' + str(i + 1) + '.jpg' for i in range(5)]
# extract features and m
# match
l = {}
d = {}
for i in range(5): //循环次数=图像数量sift.process_image(imname[i], featname[i])l[i], d[i] = sift.read_features_from_file(featname[i])matches = {}
for i in range(4): //循环次数=图像数量-1matches[i] = sift.match(d[i + 1], d[i])# visualize the matches (Figure 3-11 in the book)
for i in range(4): //循环次数=图像数量-1im1 = array(Image.open(imname[i]))im2 = array(Image.open(imname[i + 1]))figure()sift.plot_matches(im2, im1, l[i + 1], l[i], matches[i], show_below=True)# function to convert the matches to hom. points
# 将匹配转换成齐次坐标点的函数
def convert_points(j):ndx = matches[j].nonzero()[0]fp = homography.make_homog(l[j + 1][ndx, :2].T)ndx2 = [int(matches[j][i]) for i in ndx]tp = homography.make_homog(l[j][ndx2, :2].T)# switch x and y - TODO this should move elsewherefp = vstack([fp[1], fp[0], fp[2]])tp = vstack([tp[1], tp[0], tp[2]])return fp, tp# estimate the homographies
# 估计单应性矩阵
model = homography.RansacModel()fp, tp = convert_points(1)
H_12 = homography.H_from_ransac(fp, tp, model)[0] # im 1 to 2fp, tp = convert_points(0)
H_01 = homography.H_from_ransac(fp, tp, model)[0] # im 0 to 1tp, fp = convert_points(2) # NB: reverse order
H_32 = homography.H_from_ransac(fp, tp, model)[0] # im 3 to 2tp, fp = convert_points(3) # NB: reverse order
H_43 = homography.H_from_ransac(fp, tp, model)[0] # im 4 to 3# 扭曲图像
delta = 100 # 用于填充和平移 for padding and translationim1 = array(Image.open(imname[1]), "uint8")
im2 = array(Image.open(imname[2]), "uint8")
im_12 = warp.panorama(H_12, im1, im2, delta, delta)im1 = array(Image.open(imname[0]), "f")
im_02 = warp.panorama(dot(H_12, H_01), im1, im_12, delta, delta)im1 = array(Image.open(imname[3]), "f")
im_32 = warp.panorama(H_32, im1, im_02, delta, delta)im1 = array(Image.open(imname[4]), "f")
im_42 = warp.panorama(dot(H_32, H_43), im1, im_32, delta, 2 * delta)figure()
imshow(array(im_42, "uint8"))
axis('off')
show()
先了解下拼接的相关理论,将代码复制到Python中复现,对遇到的问题逐一解决
1、需要安装PCV包
参考手把手解决解决Python安装PCV_日拱一卒不慌忙的博客-CSDN博客
2、代码中的读取图像,无.sift文件
imname使我们要拼接的原图
featname是sift文件,这个文件是需要根据原图进行生成的
具体代码参考
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from PCV.localdescriptors import sift
from PCV.localdescriptors import harris# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:/windows/fonts/SimSun.ttc", size=14)imname = 'D:/ComputerVision_code/img/sdl11.jpg' //需要拼接的图像的位置
im = array(Image.open(imname).convert('L'))
sift.process_image(imname, 'empire.sift') //生成名称为empire的sift文件
l1, d1 = sift.read_features_from_file('empire.sift')figure()
gray()
subplot(121)
sift.plot_features(im, l1, circle=False)
title(u'SIFT特征',fontproperties=font)# 检测harris角点
harrisim = harris.compute_harris_response(im)subplot(122)
filtered_coords = harris.get_harris_points(harrisim, 6, 0.1)
imshow(im)
plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
axis('off')
title(u'Harris角点',fontproperties=font)show()
报错:empire.sift not found
原因:未修改PCV文件夹下的sift.py中的process_image函数。
解决方案:下载VLFeat0.9.20的版本,将三个相关的文件复制到自己项目环境中,再将Anaconda中sift.py的文件打开地址修改一下就可以了
主要参考:【python】 OSError:sift not found 问题解决_Lin-CT的博客-CSDN博客
博主讲的很详细,我就不画蛇添足了。
3、成功生成了sift文件,可以继续运行图像拼接程序,报错did not meet fit acceptance criteria
原因:图片问题,输入的图片太暗或太糊,导致系统无法进行特征提取或特征点太少无法匹配(有时候图片正常也会出现这种情况,反正出现这个问题只需换图片即可解决)。
主要参考:python计算机视觉常见报错及解决方案(不断更新中)_Lin-CT的博客-CSDN博客
个人感受:采用上述方式进行图像拼接,需要图像特征点较多并明显才能达到好的拼接效果,否则要么特征点太少程序无法运行,要么拼接效果很差。
我的图像的特征点较少,并且位移信息基本已知,我打算通过平移叠加进行拼图,在想是直接用PS拼(真香),还是再找找新的图像处理方法[哭笑不得]
快看我美丽的拼接成果。
再附两个参考博文:
SIFT特征提取+匹配_Deer dolphin的博客-CSDN博客_sift特征提取和匹配
实验四——图像拼接_cyh_first的博客-CSDN博客_图像拼接测试图片
OpenCV图像处理--常用图像拼接方法_C君莫笑的博客-CSDN博客_opencv 图像拼接
感谢在解决问题过程中各位大佬的帮助,如果我的回答帮助到你,请给我点赞加油呀~~
利用Python实现图像拼接相关推荐
- python+opencv图像拼接-python opencv 图像拼接的实现方法
初级的图像拼接为将两幅图像简单的粘贴在一起,仅仅是图像几何空间的转移与合成,与图像内容无关.高级图像拼接也叫作基于特征匹配的图像拼接,拼接时消去两幅图像相同的部分,实现拼接合成全景图. 具有相同尺寸的 ...
- mysql数据导入python_利用python将mysql中的数据导入excel
原博文 2017-06-29 13:29 − Python对Excel的读写主要有xlrd.xlwt.xlutils.openpyxl.xlsxwriter几种. 如下分别利用xlwt和openpyx ...
- python 物理学中的应用_利用python求解物理学中的双弹簧质能系统详解
前言 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的模型如下: 在这个系统里有两个物体,它们的质 ...
- 怎么用python找论文_如何利用Python绘制学术论文图表方法
论文中图表形式多样,常用的处理工具有excel.MATLAB以及Python等,excel自处理的方法有两个缺陷: 1.当数据较多时,容易出现excel"翻白眼"的现象: 2.需要 ...
- 在Ubuntu 16.04.5 LTS上利用python中的PIL模块压缩一百多兆的单张图片实操
在前面的博文中,我将300多张电影海报拼接为了一张103MB的巨幅图片,我想拿它做电脑桌面(1080P),但是这么多的图片,存储和加载是个麻烦事儿,需要将它压缩到几MB大小. 在Ubuntu 16.0 ...
- 在Linux上利用python获取本机ip
下面介绍在Linux上利用python获取本机ip的方法. 经过网上调查, 发现大致有两种方法, 一种是调用shell脚本,另一种是利用python中的socket等模块来得到,下面是这两种方法的源码 ...
- NLP实战:利用Python理解、分析和生成文本 | 赠书
导读:本文内容参考自<自然语言处理实战:利用Python理解.分析和生成文本>一书,由Hobson Lane等人所著. 本书是介绍自然语言处理(NLP)和深度学习的实战书.NLP已成为深度 ...
- 利用Python基础代码语句,实现2G时代文字小游戏,世界如此简单
优质文章,第一时间送达! 相信许多80,90后都玩过2G时代的文字小游戏,它是来自QQ家园的专属回忆.偷菜,美味小镇,大乐斗,还有精武堂等等,虽然只是文字的输出,但是留给我们这一代的人的印象却是最深刻 ...
- 利用python爬虫与数据分析,打造最强玩法,轻松成为大神级玩家!
前言: 最近迷上了一款游戏,但是作为一名程序员的我是不可能只玩游戏的,我必须把它的官网数据采集下来! 环境: windows python3.6.5 模块: requests jsonpath pyg ...
最新文章
- 转行学python后悔了-你是多少岁转行的?转行后你后悔了吗?
- 将有序数组转为二叉搜索树
- MDK linker和debug的设置以及在RAM中调试
- 【渝粤题库】陕西师范大学180208 产品管理 作业(专升本)
- oracle应收模块核销点不上,详解EBS接口开发之应收款处理
- django 1.8 官方文档翻译: 2-2-3 查找 API 参考
- 48 - LeetCode 122 121. 买卖股票的最佳时机
- 【shell系列】之正则表达式
- mod libs 课堂
- 《C#图解教程》 总览
- matlab help函数用法,MATLAB函数用法
- 公网访问局域网家用nas
- 360安全卫士推出“极速版”:永久免费、无弹窗广告!
- 怎样区分病毒性感冒和细菌性感冒?
- 巴比特独家丨从0.06%飙涨到30%,BAT在Compound的利率飙涨背后实际危机四伏
- laravel5.6 使用mail发送附件邮件
- MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据
- 使用DpInst安装驱动程序
- 苹果应用分身_苹果手机微信分身怎么下载?微信多开版地址
- Java基础语法 (Random随机数)