import cv2 import numpy as np import os # 定义文件夹路径和结果保存路径 folder_path = 'D:\wzk\JIEMIAN\images' result_path = 'D:\wzk\JIEMIAN\Result\ORB-pj.jpg' # 获取文件夹内所有图像路径 img_paths = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.jpg')] # 遍历所有图像,进行配准拼接 result = cv2.imread(img_paths[0]) for i in range(1, len(img_paths)): img = cv2.imread(img_paths[i]) # 将两幅图像转换为灰度图像 gray1 = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 提取图像特征点 orb = cv2.ORB_create() kp1, des1 = orb.detectAndCompute(gray1, None) kp2, des2 = orb.detectAndCompute(gray2, None) # 匹配特征点 matcher = cv2.DescriptorMatcher_create(cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING) matches = matcher.match(des1, des2) # 选择最佳匹配点 matches = sorted(matches, key=lambda x: x.distance) good_matches = matches[:int(len(matches)*0.15)] # 计算变换矩阵 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(result, M, (result.shape[1] + img.shape[1], result.shape[0])) result[0:img.shape[0], result.shape[1]-img.shape[1]:] = img # 保存拼接结果 cv2.imwrite(result_path, result) # 显示结果 cv2.namedWindow("Result",cv2.WINDOW_NORMAL) cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows()
时间: 2023-06-25 20:03:53 浏览: 176
这段代码使用了OpenCV库实现了ORB特征点匹配和图像拼接的功能。具体步骤如下:
1. 定义文件夹路径和结果保存路径。
2. 获取文件夹内所有图像路径。
3. 遍历所有图像,进行配准拼接。
4. 将两幅图像转换为灰度图像。
5. 提取图像特征点。
6. 匹配特征点。
7. 选择最佳匹配点。
8. 计算变换矩阵。
9. 拼接图像。
10. 保存拼接结果。
11. 显示结果。
需要注意的是,这里使用了RANSAC算法来进行匹配,可以提高匹配的鲁棒性。同时,代码中使用了ORB特征点算法,这是一种基于FAST特征点算法的改进版,可以在保证速度的同时提高匹配精度。
相关问题
import cv2 as cv import os.path import os from PIL import Image import numpy as np def Gmap(folder_path_1, folder_path): img1 = cv.imread(folder_path_1) for filename in os.listdir(folder_path): if filename.startswith(start_chars): if filename.endswith('.bmp'): img2 = cv.imread(filename) Gd2 = cv.multiply(img1, img1) Gr2 = cv.multiply(img2, img2) result1 = cv.add(img1, img2) * 2 + 1 result2 = cv.add(Gd2, Gr2) + 1 gmap = cv.subtract(result1, result2) cv.imwrite(save_path, gmap) if __name__ == '__main__': folder_path = r"D:\\table\\datasets for graduate\\dis of p\\" folder_path_1 = r"D:\\table\\datasets for graduate\\ref of p\\i01.bmp" save_path = r"D:\\table\\datasets for graduate\\gmap\\" start_chars = 'i01' Gmap(folder_path_1, folder_path)
这段代码是一个 Python 脚本,主要实现了一个 Gmap 函数,用于生成图像的 Gmap 图。具体实现方式是读取一张参考图像(即 folder_path_1 所指定的图像),然后遍历指定目录(folder_path)下的所有以 start_chars 开头且以 .bmp 结尾的图像文件。对于每张遍历到的图像,都会生成一个 Gmap 图像,保存到指定的 save_path 路径下。
Gmap 图像的生成过程是基于两张图像的像素点进行计算得出的。具体计算方式如下:
1. 分别对两张图像的像素点进行平方运算(即 Gd2 和 Gr2);
2. 将两张图像的像素点相加,再乘以 2,最后再加上 1(即 result1 = cv.add(img1, img2) * 2 + 1);
3. 将 Gd2 和 Gr2 相加,再加上 1(即 result2 = cv.add(Gd2, Gr2) + 1);
4. 将 result1 和 result2 相减,即可得到 Gmap 图像(即 gmap = cv.subtract(result1, result2))。
需要注意的是,这段代码中使用了 OpenCV 和 PIL 库,分别用于图像处理和图像读取。同时,代码中的路径需要根据实际情况进行修改,以确保程序能够读取和保存图像文件。
修改代码:import os from PIL import Image import glob import numpy as np # 遍历文件夹 folder_path = 'E:/机器学习/helefull/labels' folders = os.listdir(folder_path) # print(folders) for filename in glob.glob(r'E:/机器学习/helefull/labels/*.png'): img=Image.open(filename).convert("RGB") # images=np.asarray(img) # print(images) # 只处理其中的20个文件夹 folder for folder in folders[:20]: folder_full_path = os.path.join(folder_path, folder) # print(folder_full_path) if os.path.isdir(folder_full_path): images = os.listdir(folder_full_path) print(images) blank_img = Image.new('RGB', (417, 354), (0, 0, 0)) for i,image_name in images: # 打开当前图片 img_path = os.path.join(folder_full_path, image_name) img = Image.open(img_path) # 遍历每一个像素点 for x in range(img.width): for y in range(img.height): # 如果当前像素点值为255,则将该像素点在空白图片上标记为i+1 if img.getpixel((x, y)) == 255: blank_img.putpixel((x, y), i+100) blank_img.save(f'new_{folder}.png')
import os
from PIL import Image
import glob
import numpy as np
# 遍历文件夹
folder_path = 'E:/机器学习/helefull/labels'
folders = os.listdir(folder_path)
for filename in glob.glob(r'E:/机器学习/helefull/labels/*.png'):
img = Image.open(filename).convert("RGB")
# images=np.asarray(img)
# print(images)
# 只处理其中的20个文件夹
for folder in folders[:20]:
folder_full_path = os.path.join(folder_path, folder)
# print(folder_full_path)
if os.path.isdir(folder_full_path):
images = os.listdir(folder_full_path)
print(images)
blank_img = Image.new('RGB', (417, 354), (0, 0, 0))
for i, image_name in enumerate(images):
# 打开当前图片
img_path = os.path.join(folder_full_path, image_name)
img = Image.open(img_path)
# 遍历每一个像素点
for x in range(img.width):
for y in range(img.height):
# 如果当前像素点值为255,则将该像素点在空白图片上标记为i+1
if img.getpixel((x, y)) == 255:
blank_img.putpixel((x, y), i+100)
blank_img.save(f'new_{folder}.png')
阅读全文