我想要在一个新图像中聚合几个图像每列8个图像,每行5个并行使用Python中的openCV。
奇怪的是,我没有找到直接解决这个问题的答案。根据我对openCV的了解,我现在将计算应该复制现有图像的图像的宽度和高度,使用这些图像创建一个numpy数组,并将Pinterest的相应区域的值更改为每个图像的值。
这个程序是否有效,更重要的是没有找到一个没有找到的问题的简单解决方案?
答案 0 :(得分:3)
在OpenCV的Python API中读取图像时,会得到Numpy数组。 Numpy具有vstack()
和hstack()
函数,可用于垂直和水平堆叠数组(图像)。
让我们用OpenCV打开两张图片:
import cv2
import numpy as np
knight = cv2.imread('knight.jpg', cv2.IMREAD_GRAYSCALE)
要在numpy中使用堆叠,图像尺寸会受到堆叠轴(垂直/水平)的限制,因此对于此图像,我将使用cv2.resize()
来获得正确的尺寸
queen = cv2.imread('queen.jpg', cv2.IMREAD_GRAYSCALE)
queen = cv2.resize(queen, (525, 700))
让我们通过堆叠2个骑士来制作第一列
col_1 = np.vstack([knight, knight]) # Simply put the images in the list
# I've put 2 knights as example
现在让我们制作一个包含2个皇后区的第二列
col_2 = np.vstack([queen, queen])
我们将这两列放在一起,但这次我们将hstack()
用于此
collage = np.hstack([col_1, col_2]
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))