这几天在做图片的拼接融合,参考了网上的一个教程,文章末尾附上链接,处理效果还是不错的,但是速度比较慢。

总结一下思路:

1.读取两张图片,做边界填充,这个根据自己图片的融合范围自己调整(要求两个图片大小一致)

2.通过sift特征点检测,然后进行特征点的匹配筛选

3.通过匹配的像素点计算单应性矩阵

4.对读取的后一张图片用单应性矩阵进行仿射变换

5.通过双线性插值融合图片重叠部分

在第五部分,原方法是通过逐像素点融合图片,速度很慢,在这里我把它改成了用numpy库来处理融合过程,在我的电脑上从之前的融合需要15.6s到使用numpy的4.8s, 可见numpy对矩阵的处理速度还是比较快的。

下面贴上代码

import numpy as np
import cv2
from matplotlib import pyplot as plt
import timedef stitch(path1, path2):"""传入图片路径,返回变换过后的填充图片:param path1::param path2::return:"""# 边界填充top, bot, left, right = 100, 100, 0, 800img1 = cv2.imread(path1)img2 = cv2.imread(path2)img1_size = img1.shape[:2]img2 = cv2.resize(img2, (img1_size[1], img1_size[0]))srcImg = cv2.copyMakeBorder(img1, top, bot, left, right, cv2.BORDER_CONSTANT, value=(0, 0, 0))testImg = cv2.copyMakeBorder(img2, top, bot, left, right, cv2.BORDER_CONSTANT, value=(0, 0, 0))img1gray = cv2.cvtColor(srcImg, cv2.COLOR_BGR2GRAY)img2gray = cv2.cvtColor(testImg, cv2.COLOR_BGR2GRAY)sift = cv2.xfeatures2d_SIFT().create()# find the keypoints and descriptors with SIFTkp1, des1 = sift.detectAndCompute(img1gray, None)kp2, des2 = sift.detectAndCompute(img2gray, None)# FLANN parametersFLANN_INDEX_KDTREE = 1index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)search_params = dict(checks=50)flann = cv2.FlannBasedMatcher(index_params, search_params)matches = flann.knnMatch(des1, des2, k=2)# Need to draw only good matches, so create a maskmatchesMask = [[0, 0] for i in range(len(matches))]good = []pts1 = []pts2 = []# ratio test as per Lowe's paperfor i, (m, n) in enumerate(matches):if m.distance < 0.7 * n.distance:good.append(m)pts2.append(kp2[m.trainIdx].pt)pts1.append(kp1[m.queryIdx].pt)matchesMask[i] = [1, 0]draw_params = dict(matchColor=(0, 255, 0),singlePointColor=(255, 0, 0),matchesMask=matchesMask,flags=0)img3 = cv2.drawMatchesKnn(img1gray, kp1, img2gray, kp2, matches, None, **draw_params)plt.imshow(img3, ), plt.show()MIN_MATCH_COUNT = 10if len(good) > MIN_MATCH_COUNT:src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)warpImg = cv2.warpPerspective(testImg, np.array(M), (testImg.shape[1], testImg.shape[0]),flags=cv2.WARP_INVERSE_MAP)return srcImg, warpImgelse:print("Not enough matches are found - {}/{}".format(len(good), MIN_MATCH_COUNT))matchesMask = Nonedef blend(srcImg, warpImg, savename=None):"""图片融合,"""rows, cols = srcImg.shape[:2]# 找到左右重叠区域global left, rightfor col in range(0, cols):if srcImg[:, col].any() and warpImg[:, col].any():left = colbreakfor col in range(cols - 1, 0, -1):if srcImg[:, col].any() and warpImg[:, col].any():right = colbreakres = np.zeros([rows, cols, 3], np.uint8)alpha = np.zeros((rows, right - left, 3), dtype=np.float)for row in range(0, rows):for col in range(left, right):if not srcImg[row, col].any():  # src不存在alpha[row, col - left, :] = 0elif not warpImg[row, col].any():  # warpImg 不存在alpha[row, col - left, :] = 1else:  # src 和warp都存在srcImgLen = float(abs(col - left))testImgLen = float(abs(col - right))alpha[row, col - left, :] = testImgLen / (srcImgLen + testImgLen)res[:, :left] = srcImg[:, :left]res[:, right:] = warpImg[:, right:]res[:, left:right] = np.clip(srcImg[:, left:right] * alpha + warpImg[:, left:right] * (np.ones_like(alpha) - alpha),0, 255)# opencv is bgr, matplotlib is rgbres = cv2.cvtColor(res, cv2.COLOR_BGR2RGB)if savename is not None:plt.imsave(savename, res)return resif __name__ == "__main__":path1 = 'data/1.jpg'path2 = 'data/2.jpg'path3 = 'data/3.jpg'path4 = 'data/4.jpg'path5 = 'stitch12.jpg'path6 = 'stitch34.jpg'res12 = 'data/stitch12.jpg'res34 = 'data/stitch34.jpg'srcImg, warpImg = stitch(path1, path2)start = time.time()res = blend(srcImg, warpImg, 'stitch12.jpg')end = time.time()print('融合时间:', end - start)# show the resultplt.figure()plt.imshow(res)plt.show()

附上效果图(随手拍的图片)

链接:
https://www.cnblogs.com/ToBeDeveloper-Zhen/p/9314760.html

python opencv图片拼接融合相关推荐

  1. python opencv图片拼接、特征点匹配

    一.算法目的: 在同一位置拍摄的两幅或者多幅图像是单应性相关的的,使用该约束将很多图片缝补起来,拼成一个大的图像来创建全景图像.两张图片的拼接必须首先找到相同特征,也就是说两张照片必须要有重叠的部分才 ...

  2. 【Opencv】Python+openCV实现全景图拼接(左右两张图片拼接成一张全景图)

    Python+openCV实现全景图拼接(左右两张图片拼接成一张全景图) 全景图拼接 思路 具体步骤 代码与结果 代码 效果测试1 效果测试2 全景图拼接 思路 这个就是简单对左右两张图进行拼接,希望 ...

  3. 重磅升级,52个Python+OpenCV实战项目教你掌握图像处理

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 近期小白学视觉公众号推出了多篇Python+OpenCV实战项目的 ...

  4. Python + OpenCV 太好玩了,可惜你可能还不会

    这些年,你可能看过很多这样的新闻: "用 Python + OpenCV 把照片变成油画--" "Python + OpenCV 实现自动扫雷,挑战世界记录--" ...

  5. [python opencv 计算机视觉零基础到实战] 四、了解色彩空间及其详解

    一.学习目标 了解什么是色彩空间 了解opencv中色彩空间的转换 目录 [python opencv 计算机视觉零基础到实战] 一.opencv的helloworld [[python opencv ...

  6. Python+OpenCV:图像金字塔

    Python+OpenCV:图像金字塔 理论 通常情况下,我们使用固定大小的图像.但在某些情况下,我们需要处理(相同的)不同分辨率的图像. 例如,当搜索图像中的某些东西时,比如脸,我们不确定该物体在图 ...

  7. 基于python+opencv的图像目标区域自动提取

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 一.提取纸张中的内容 一张照片中的感兴趣区域总是沿着x,y,z三个轴都有一定倾斜(如下图),要 ...

  8. Python+OpenCV图像处理(一篇全)

    参考:1.网易云课堂 Python+OpenCV图像处理 - 网易云课堂 2.[在水一方xym的博客]业精于勤荒于嬉,行成于思毁于随 - CSDN博客 https://blog.csdn.net/za ...

  9. Python OpenCV 之图像乘除与像素的逻辑运算,图像处理取经之旅第 17 天

    今天的学习的内容是:通过 Python OpenCV 对图像实现乘除操作,涉及函数为 cv2.multiply 与 cv2.divide.后面又补充了一些像素的逻辑运算,以及一个综合案例 cv2.mu ...

最新文章

  1. (深入理解)强化学习中on policy和off policy的区别
  2. java try、catch、finally及finally执行顺序详解
  3. UE4 Run On Server与Run on owning client
  4. 检测窥屏_开挂、狙击、窥屏?乱象丛生的炉石狂野天梯,到底怎么了?
  5. 【CodeForces - 761C】Dasha and Password (暴力可过,标解dp,字符串,有坑总结)
  6. 互联网为什么要版权,我支持资源共享。
  7. Summarize to the Power of Two(CF-1005C)
  8. ubuntu 安装 wifi 驱动_论如何在 MacBook Pro 安装 Ubuntu 18.04(解决 wifi、触摸板、键盘驱动)...
  9. Python实战从入门到精通第八讲——字符串与文本2之合并拼接字符串
  10. java递归生成树结构_突破CRUD | 万能树Java工具类封装(源码)
  11. 【知识索引】【汇编语言】
  12. 20170826滴滴算法工程师笔试
  13. matlab临界转速教学,转子动力学求解转子临界转速与固有频率详解.ppt
  14. 中国AI公司会议室取名简史
  15. android实现qq邮箱多个图标效果
  16. TODA-MES简介
  17. php 跳转qq群代码_QQ群一键强制加群API源代码
  18. 《大国大城》读书笔记
  19. 【MyBatis】缓存——使查询变得快快快!
  20. Oracle存储空间管理

热门文章

  1. SOLIDWORKS 2021新功能快报!圆弧边翻边折弯
  2. python项目源码 日程管理_[Python] Python日程处理
  3. Android根据Uri跳转Skype会话页面
  4. I18n实现中英文切换
  5. 北风网--网络安全系列课程之网络攻防全面实战(涉及加密、解密)
  6. 华为交换机创建Vlan,批量加入对应端口号
  7. 电子电气架构——ECU升级(Bootloader)A/B分区策略汇总
  8. mate10如何android,华为Mate10怎么使用NFC功能?华为Mate10手机NFC功能使用详细教程...
  9. SpringBoot集成Redis报non null key required(已解决)
  10. CAD图中如何插入Excel表格?