[Python & OpenCV]图片拼接程序

今天急需拼接几张差不多大小的图片,于是应用Opencv的一部分知识自己做了个程序:
1
可以随意拼接图片(横着、竖着、任意指定图片个数)
源码如下:

import cv2
import numpy as np                         
import os
import pytesseract
from matplotlib import pyplot as plt
from PIL import Image



def image_add(image1,image2):
    h1,w1,c1 = image1.shape
    h2,w2,c2 = image2.shape
    if c1 != c2:
        print("channels NOT match, cannot merge")
        return 
    else:
        if w1 > w2:
            tmp = np.zeros([h2,w1-w2,c1])
            #image3 = np.hstack([image2,tmp])#水平
            image4 = np.vstack([image1,image2])#竖直
        elif w1 == w2:
            #image3 = np.hstack([image1,image2])
            image4 = np.vstack([image1,image2])
        else:
            tmp = np.zeros([h1,w2-w1,c2])
            #image3 = np.hstack([image1,tmp])
            image4 = np.vstack([image3,image2])
    
    #cv2.imshow('image3',image3)
    #cv2.imshow('image4',image4)
    cv2.imwrite(r"H:/Collected/95.jpg",image4)        #保存图像(“路径”,图像)

    print('OK!!!!!!')
    #cv2.waitKey(0)
    #return image3



def Test():
    filename = input("Please Input Your Image : \n")
    image = cv2.imread(filename,1)
    x,y,z = image.shape
    img = np.reshape(image,[x,y-1000])
    cv2.imshow("image",image)
    cv2.imshow("img",img)



def Process():
    N = int(input("How Many Pictures Do You Want To Stitch,But Please Don't Exceed Ten: \n"))
    if N > 10:
        print("Too Many Pictures You Entered!!!!!!!!!")
    else:
        filename = [0,0,0,0,0,0,0,0,0,0]
        image = [0,0,0,0,0,0,0,0,0,0]
        ave_H = 0
        ave_S = 0
        for i  in range(N):
            filename[i] = input("Please Input Your Image : \n")
            image[i] = cv2.imread(filename[i],1)
        mode = input("Please select stitching mode H or S: \n")
        Result = image[0]
        if mode == 'H':
            for i in range(N):
                ave_H = ave_H + int(image[i].shape[0] / N)
            print("%d"%(ave_H))
            #print("%d"%(image[0].shape[0]))
            for i in range(N-1):
                Result = np.hstack([Result,image[i+1]])
        if mode == 'S':
            for i in range(N):
                ave_S = ave_S + int(image[i].shape[1] / N)
            print("%d"%(ave_S))
            #print("%d"%(image[0].shape[1]))
            for i in range(N-1):
                Result = np.vstack([Result,image[i+1]])
    storeADD = input("Please Input A Storage Location : \n")
    cv2.imwrite(storeADD,Result)       


Process()

有想要打包exe程序的可以私信我。

Python中使用OpenCV库进行图片拼接的代码一般会用到特征检测、特征匹配、图像变换等步骤。下面是一个简单的示例代码,演示如何使用OpenCV进行两张图片拼接: ```python import cv2 import numpy as np # 读取两张图片 img1 = cv2.imread('image1.jpg', 0) # 查询图像 img2 = cv2.imread('image2.jpg', 0) # 训练图像 # 初始化ORB检测器 orb = cv2.ORB_create() # 使用ORB找到关键点和描述符 kp1, des1 = orb.detectAndCompute(img1, None) kp2, des2 = orb.detectAndCompute(img2, None) # 创建BFMatcher对象 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # 匹配描述符 matches = bf.match(des1, des2) # 根据距离排序 matches = sorted(matches, key=lambda x: x.distance) # 绘制前10个匹配项 img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=2) # 显示图片 cv2.imshow('Matches', img3) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段代码首先读取了两张要拼接图片,然后使用ORB算法检测关键点并计算描述符。之后,使用BFMatcher对两张图片的描述符进行匹配,并将匹配结果按照匹配距离排序。最后,使用`cv2.drawMatches`函数将前10个最佳匹配的特征点在图片上绘制出来,并显示结果。 请注意,这只是进行特征匹配的示例,并没有实现图像变换和实际拼接。真正的图像拼接还需要计算匹配特征点之间的几何变换矩阵,然后应用该矩阵变换第二张图片,并将变换后的图片与第一张图片进行融合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值