【python图像处理】单张图像拼接与批量图片拼接

一、效果

 

二、代码

1、单张图片拼接

# 图片拼接
from PIL import Image
# pil paste可以进行图片拼接
import cv2
import numpy as np

path="F:/out/"+str(0)+".jpg"
img_out=cv2.imread(path)

num=5
for i in range(1,num):
    path="F:/out/"+str(i)+".jpg"
    img_tmp=cv2.imread(path)

    #横向
    img_out = np.concatenate((img_out, img_tmp), axis=1)

    # 纵向
    # img_out = np.concatenate((img_out, img_tmp))

cv2.imshow("IMG",img_out)
cv2.imwrite("F:/out/merge.jpg",img_out)
cv2.waitKey(0)

2、批量图片拼接

# 图片拼接
from PIL import Image
# pil paste可以进行图片拼接
import cv2
import numpy as np
import glob as glob
import os

num=5
os.chdir(r"F:\out")
img_name=[]
for file_name in glob.glob("*.jpg"):
    print(file_name)
    img_name.append(file_name)

# 批量处理图片
img_path = glob.glob("F:/out/*jpg")
for i in range(int(len(img_path)/num)):
    path = img_path[i*num]
    print(path)
    img_out = cv2.imread(path)

    for j in range(1, num):
        path = img_path[i*num+j]
        img_tmp = cv2.imread(path)

        # 横向
        img_out = np.concatenate((img_out, img_tmp), axis=1)

    # cv2.imshow("IMG", img_out)
    cv2.imwrite("F:/out/"+img_name[i*num+j][0:-6]+"_out.jpg", img_out)

 

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
可以使用OpenCV中的warpPerspective()方法和findHomography()方法来实现多张像的拼接。具体步骤如下: 1.读取多张像并提取它们的特征点。 2.对于每两张像,使用OpenCV中的findHomography()方法计算它们之间的单应矩阵。 3.使用OpenCV中的warpPerspective()方法将每张像转换为拼接后的像中的位置。 4.将所有转换后的图像拼接在一起。 下面是一个示例代码,假设我们有三张像im1、im2和im3,它们已经被读取并且我们已经计算出了它们之间的单应矩阵h12、h23和h31: ```python import cv2 import numpy as np # 读取像 im1 = cv2.imread('image1.jpg') im2 = cv2.imread('image2.jpg') im3 = cv2.imread('image3.jpg') # 提取特征点 detector = cv2.xfeatures2d.SIFT_create() matcher = cv2.FlannBasedMatcher({'algorithm': 0, 'trees': 5}, {}) kpts1, desc1 = detector.detectAndCompute(im1, None) kpts2, desc2 = detector.detectAndCompute(im2, None) kpts3, desc3 = detector.detectAndCompute(im3, None) matches12 = matcher.knnMatch(desc1, desc2, 2) matches23 = matcher.knnMatch(desc2, desc3, 2) matches31 = matcher.knnMatch(desc3, desc1, 2) # 计算单应矩阵 pts1 = [] pts2 = [] for m in matches12: if len(m) == 2 and m[0].distance < m[1].distance * 0.7: pts1.append(kpts1[m[0].queryIdx].pt) pts2.append(kpts2[m[0].trainIdx].pt) pts1 = np.array(pts1) pts2 = np.array(pts2) h12, status = cv2.findHomography(pts1, pts2, cv2.RANSAC, 5.0) pts1 = [] pts2 = [] for m in matches23: if len(m) == 2 and m[0].distance < m[1].distance * 0.7: pts1.append(kpts2[m[0].queryIdx].pt) pts2.append(kpts3[m[0].trainIdx].pt) pts1 = np.array(pts1) pts2 = np.array(pts2) h23, status = cv2.findHomography(pts1, pts2, cv2.RANSAC, 5.0) pts1 = [] pts2 = [] for m in matches31: if len(m) == 2 and m[0].distance < m[1].distance * 0.7: pts1.append(kpts3[m[0].queryIdx].pt) pts2.append(kpts1[m[0].trainIdx].pt) pts1 = np.array(pts1) pts2 = np.array(pts2) h31, status = cv2.findHomography(pts1, pts2, cv2.RANSAC, 5.0) # 转换像 size = (im1.shape[1] + im2.shape[1] + im3.shape[1], im1.shape[0]) im12 = cv2.warpPerspective(im1, h12, size) im23 = cv2.warpPerspective(im2, np.dot(h23, h12), size) im31 = cv2.warpPerspective(im3, np.dot(h31, np.dot(h23, h12)), size) # 拼接像 result = np.zeros((im1.shape[0], size[0], 3), dtype=np.uint8) result[:, :im1.shape[1], :] = im1 result[:, im1.shape[1]:im1.shape[1] + im2.shape[1], :] = im2 result[:, im1.shape[1] + im2.shape[1]:, :] = im3 mask = np.zeros((im1.shape[0], size[0]), dtype=np.uint8) mask[:, :im1.shape[1]] = 255 mask = cv2.warpPerspective(mask, h12, size) result = cv2.seamlessClone(im12, result, mask, (im1.shape[1], 0), cv2.NORMAL_CLONE) mask = np.zeros((im1.shape[0], size[0]), dtype=np.uint8) mask[:, :im1.shape[1] + im2.shape[1]] = 255 mask = cv2.warpPerspective(mask, np.dot(h23, h12), size) result = cv2.seamlessClone(im23, result, mask, (im1.shape[1] + im2.shape[1], 0), cv2.NORMAL_CLONE) mask = np.zeros((im1.shape[0], size[0]), dtype=np.uint8) mask[:, im1.shape[1]:] = 255 mask = cv2.warpPerspective(mask, np.dot(h31, np.dot(h23, h12)), size) result = cv2.seamlessClone(im31, result, mask, (im1.shape[1] + im2.shape[1], 0), cv2.NORMAL_CLONE) # 显示结果 cv2.imshow('result', result) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值