如何使用 python 和 opencv 连接不同形状的图像?

How to concatenate images of different shapes using python and opencv?

我有一些图片(比如 5 张),每张图片都有不同的形状。我想为我的项目报告连接成一张图片。您能否提供一种使用 opencv 和 python 的简单方法?

生成的图像类似于下图。

在 numpy 中我尝试了类似的方法,它有效但仅适用于两张图像。

r = np.concatenate((images[1][:, :, 1], images[1][:, :, 3]), axis=1)

获得您在屏幕截图中显示的结果可能需要更多的修改,但只需将图像堆叠在一起就可以像这样完成:

import cv2
import numpy as np

image_names = ['original_field_1_0.PNG','original_field_1_1.PNG','original_field_1_3.PNG','original_field_1_4.PNG','original_field_1_5.PNG']
images = []
max_width = 0 # find the max width of all the images
total_height = 0 # the total height of the images (vertical stacking)

for name in image_names:
    # open all images and find their sizes
    images.append(cv2.imread(name))
    if images[-1].shape[1] > max_width:
        max_width = images[-1].shape[1]
    total_height += images[-1].shape[0]

# create a new array with a size large enough to contain all the images
final_image = np.zeros((total_height,max_width,3),dtype=np.uint8)

current_y = 0 # keep track of where your current image was last placed in the y coordinate
for image in images:
    # add an image to the final array and increment the y coordinate
    final_image[current_y:image.shape[0]+current_y,:image.shape[1],:] = image
    current_y += image.shape[0]

cv2.imwrite('fin.PNG',final_image)

基本思路是先找到图像的总大小,然后创建一个该大小的数组,最后将这些范围内的像素设置为每个单独图像的像素,同时向下(或侧向,取决于什么)你要)。

您还可以为何时开始另一行或另一列实施阈值。

我修改了代码使其成为一个简单的函数,可能对其他人有用。

def get_one_image(images):
        img_list = []
        padding = 200
        for img in images:
            img_list.append(cv2.imread(img))
        max_width = []
        max_height = 0
        for img in img_list:
            max_width.append(img.shape[0])
            max_height += img.shape[1]
        w = np.max(max_width)
        h = max_height + padding

        # create a new array with a size large enough to contain all the images
        final_image = np.zeros((h, w, 3), dtype=np.uint8)

        current_y = 0  # keep track of where your current image was last placed in the y coordinate
        for image in img_list:
            # add an image to the final array and increment the y coordinate
            final_image[current_y:image.shape[0] + current_y, :image.shape[1], :] = image
            current_y += image.shape[0]
        cv2.imwrite('out.png', final_image)

@ajayramesh 解决方案的这种修改对我有用。此函数接受图像列表并输出单个图像,其中所有输入图像垂直堆叠:

def get_one_image(img_list):
    max_width = 0
    total_height = 200  # padding
    for img in img_list:
        if img.shape[1] > max_width:
            max_width = img.shape[1]
        total_height += img.shape[0]

    # create a new array with a size large enough to contain all the images
    final_image = np.zeros((total_height, max_width, 3), dtype=np.uint8)

    current_y = 0  # keep track of where your current image was last placed in the y coordinate
    for image in img_list:
        # add an image to the final array and increment the y coordinate
        image = np.hstack((image, np.zeros((image.shape[0], max_width - image.shape[1], 3))))
        final_image[current_y:current_y + image.shape[0], :, :] = image
        current_y += image.shape[0]
    return final_image