如何在openCV中从现有图像中最佳地创建新图像

时间:2016-05-11 12:34:10

标签: python opencv copy

我想要在一个新图像中聚合几个图像每列8个图像,每行5个并行使用Python中的openCV。

奇怪的是,我没有找到直接解决这个问题的答案。根据我对openCV的了解,我现在将计算应该复制现有图像的图像的宽度和高度,使用这些图像创建一个numpy数组,并将Pinterest的相应区域的值更改为每个图像的值。

这个程序是否有效,更重要的是没有找到一个没有找到的问题的简单解决方案?

3 个答案:

答案 0 :(得分:3)

在OpenCV的Python API中读取图像时,会得到Numpy数组。 Numpy具有vstack()hstack()函数,可用于垂直和水平堆叠数组(图像)。

让我们用OpenCV打开两张图片:

import cv2
import numpy as np

knight = cv2.imread('knight.jpg', cv2.IMREAD_GRAYSCALE)

enter image description here

要在numpy中使用堆叠,图像尺寸会受到堆叠轴(垂直/水平)的限制,因此对于此图像,我将使用cv2.resize()来获得正确的尺寸

queen = cv2.imread('queen.jpg', cv2.IMREAD_GRAYSCALE)
queen = cv2.resize(queen, (525, 700))

enter image description here

让我们通过堆叠2个骑士来制作第一列

col_1 = np.vstack([knight, knight]) # Simply put the images in the list
                                    # I've put 2 knights as example

enter image description here

现在让我们制作一个包含2个皇后区的第二列

col_2 = np.vstack([queen, queen])

我们将这两列放在一起,但这次我们将hstack()用于此

collage = np.hstack([col_1, col_2]

enter image description here

Et voila,2 x 2的拼贴画,您可以根据自己的需要进行调整。请注意,堆叠中传递的图像需要相同或任何其他内容,只要您尊重尺寸,就可以传入任何图像列表。

答案 1 :(得分:0)

如果其他人发现它有用,这里有一个简单的例子,概括了@ bakkal的代码,用任意数量的图像创建拼贴。它创建了一个拼贴画(为简单起见,kxk方形拼贴画,并假设所有图像都具有相同的尺寸 - 但是,不要忘记调整图像大小!)从图像目录开始,首先水平堆叠图像以创建k行,然后垂直堆叠行以创建最终画布。

import os


def create_collages(image_dir):
    image_paths = os.listdir
    n = len(image_paths)
    # find nearest square
    collage_size = int(math.floor(math.sqrt(len(good_paths))))

    # horizontally stacking images to create rows
    rows = []
    k = 0 # counter for number of rows
    for i in range(collage_size**2):
        if i % collage_size == 0: # finished with row, start new one
            if k > 0:
                rows.append(cur_row)

            cur_row = cv2.imread(os.path.join(image_dir, image_paths[i]))
            k += 1
        else:             # continue stacking images to current row
            cur_img = cv2.imread(os.path.join(image_dir, image_paths[i]))
            cur_row = np.hstack([cur_row, cur_img])

        # vertically stacking rows to create final collage.
        collage = rows[0]

        for i in range(1, len(rows)):
            collage = np.vstack([collage, rows[i]])

    return collage

答案 2 :(得分:0)

调整所有图像的大小,并放置在文件夹( input_dir )中。这是一个简单的解决方案, collage_size 参数表示拼贴中的图像数量(r行,c-col)。如果文件夹中有更多图像,它将随机抽取r * c图像样本,以便可以提供整体表示。我个人一直在通过训练对象检测模型来分析各种对象。

def create_collage(input_dir, collage_size):
    r, c = collage_size
    images_outers= []
    for i in range(r):
        images = []
        for image_name in sample(os.listdir(input_dir), c):
            print(image_name)
            image = cv2.imread(os.path.join(input_dir, image_name))
            images.append(image)
        image_outer = np.hstack(images)
        images_outers.append(image_outer)
    return(np.vstack(images_outers))