python实现固定尺寸图像拼接

本文实例为大家分享了python实现固定尺寸图像拼接,供大家参考,具体内容如下
讲解

1、代码效果:固定尺寸图像拼接

代码

import os
import cv2
import numpy as np


def joint(or_path, tar_path, size):
  determination = tar_path
  if not os.path.exists(determination):
    os.makedirs(determination)

  path = or_path
  folders = os.listdir(path)
  folders_name = []
  folders.sort(key = lambda x: int(x.split('.')[0]))
  for folder in folders:
    folders_name.append(path + "\\" + str(folder))
  foldler_len = len(folders_name)
  joint = []
  for i in range(size):
    joint.append(cv2.imread(folders_name[i]))
  index = 0
  for i in range(len(folders_name)):
    if i < size:
      continue
    image = cv2.imread(folders_name[i])
    joint[index] = np.hstack((joint[index], image))
    index += 1
    if index > size - 1:
      index = 0
  for i in range(1, len(joint)):
    joint[0] = np.vstack((joint[0], joint[i]))
  cv2.imwrite(tar_path + "/all.jpg", joint[0])
  print(joint[0].shape)


if __name__ == "__main__":
  joint(r"", r"", size)#原图像文件夹路径、新图像存放路径、单方向图像数

运行结果

运行前

image.png

运行后

image.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python实现图片拼接并输出全景图片的方法如下: 首先,需要安装和导入必要的库,如numpy、opencv和matplotlib。 ```python import cv2 import numpy as np from matplotlib import pyplot as plt ``` 然后,需要加载待拼接的图片,将其转换为灰度图,并将其特征进行检测和描述。 ```python # 加载待拼接的图片 image1 = cv2.imread('image1.jpg') image2 = cv2.imread('image2.jpg') # 转换为灰度图 gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) # 创建SIFT对象用于特征检测和描述 sift = cv2.SIFT_create() # 检测和描述特征点 kp1, des1 = sift.detectAndCompute(gray1, None) kp2, des2 = sift.detectAndCompute(gray2, None) ``` 接下来,需要使用特征匹配算法(如FLANN)来找到两幅图片中的匹配点。 ```python # 创建FLANN匹配器 flann = cv2.FlannBasedMatcher() # 进行特征匹配 matches = flann.knnMatch(des1, des2, k=2) # 选择优秀的匹配点 good_matches = [] for m, n in matches: if m.distance < 0.7 * n.distance: good_matches.append(m) ``` 然后,需要将匹配点对应的像素坐标提取出来,并进行透视变换以实现图片的拼接。 ```python # 提取匹配点对应的像素坐标 src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2) dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2) # 透视变换 M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) result = cv2.warpPerspective(image1, M, (image1.shape[1] + image2.shape[1], image1.shape[0])) result[0:image2.shape[0], 0:image2.shape[1]] = image2 ``` 最后,使用matplotlib库将拼接好的全景图显示出来并保存。 ```python # 显示和保存全景图 plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB)) plt.xticks([]) plt.yticks([]) plt.show() cv2.imwrite('panorama.jpg', result) ``` 以上是使用Python实现图片拼接并输出全景图片的基本步骤,根据实际情况可以进行相应的调整和优化。 ### 回答2: Python实现图片拼接,输出全景图片的一种方法是使用OpenCV库。以下是大致的步骤描述: 1. 首先,我们需要将多张图片加载进来作为拼接的原始图片。使用OpenCV的`cv2.imread()`函数可以读取图片。假设我们有n张图片,将它们存储在一个列表中。 2. 接下来,我们需要找到每张图片的特征点。使用OpenCV的`cv2.ORB_create()`函数可以初始化一个ORB(Oriented FAST and Rotated BRIEF)对象,用于检测特征点。然后,使用`detectAndCompute()`函数找到每张图片的关键点和特征描述符。 3. 然后,我们需要在每个图像对之间找到匹配的特征点。使用OpenCV的`cv2.BFMatcher()`函数初始化一个Brute-Force匹配器对象,并使用`knnMatch()`函数进行特征点匹配。 4. 接下来,我们需要根据匹配的特征点来计算透视变换矩阵。使用OpenCV的`cv2.findHomography()`函数来计算透视变换。该函数接受匹配的关键点作为输入,并返回一张图像到另一张图像的透视变换矩阵。 5. 然后,我们使用透视变换矩阵将图像进行拼接。使用OpenCV的`cv2.warpPerspective()`函数,传入待拼接的图像和透视变换矩阵,可以对图像进行透视变换。 6. 最后,我们将拼接后的图像保存为全景图片。使用OpenCV的`cv2.imwrite()`函数将拼接后的图像保存到指定路径。 以上是简要的步骤描述,实际实现中还需要考虑一些细节问题,并根据具体的需求进行适当的调整。 ### 回答3: Python使用OpenCV库可以实现图片的拼接,从而输出全景图片。以下是一个简单的代码示例: ```python import cv2 import numpy as np def stitch_images(images): # 初始化拼接器 stitcher = cv2.Stitcher_create() # 进行拼接 status, panorama = stitcher.stitch(images) # 返回拼接结果(status表示拼接成功与否) return panorama, status # 读取需要拼接的图片 image1 = cv2.imread('image1.jpg') image2 = cv2.imread('image2.jpg') # 将图片放入列表中 images = [image1, image2] # 调用拼接函数 panorama, status = stitch_images(images) # 判断拼接结果是否成功 if status == cv2.Stitcher_OK: # 保存全景图片 cv2.imwrite('panorama.jpg', panorama) # 显示全景图片 cv2.imshow('Panorama Image', panorama) cv2.waitKey(0) cv2.destroyAllWindows() else: print("拼接失败") ``` 该代码首先导入了需要用到的库,然后定义了一个`stitch_images`函数,该函数利用OpenCV的`Stitcher_create`函数创建了一个拼接器对象,然后调用`stitch`函数对图片进行拼接。最后,根据拼接的结果进行判断,如果成功则保存全景图片,并显示出来,否则输出拼接失败的信息。 需要注意的是,该代码只是一个基本示例,对于复杂的场景可能需要进一步调整参数或使用其他技术来提高拼接的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值