2016-05-11 99 views
2

我有幾張圖像,我想要在每張圖像中添加一個新圖像8個圖像,每行5個並行使用Python中的openCV。如何從openCV中的現有圖像中最好地創建新圖像

奇怪的是,我沒有找到直接解決這個問題的答案。從我在openCV方面的多餘知識中,我現在會計算應該複製現有圖像的圖像的寬度和高度,使用這些圖像創建一個numpy陣列,並將Pinterest對應區域的值更改爲每個圖像的值。

此程序是否正常工作,更重要的是沒有找到更容易解決此問題的方法嗎?

+1

不,這是正確的方法,並沒有一個更容易。你可以從[這裏](http://stackoverflow.com/a/35683236/5008845)得到這個想法。基本上創建足夠大的目標圖像,並將每個圖像複製到正確的位置。 – Miki

+0

thx,爲答案。然而,我不能僅僅通過評論來回答這個問題。也許你可以將它轉換爲常規響應? –

+0

你可以用自己的實例來回答自己,然後接受你自己的答案。我無法在Python中創建一個工作示例,因此我不會回答。很高興幫助 – Miki

回答

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的堆疊,有限制上取決於stackng軸圖像尺寸(垂直/水平),所以對於這個形象,我會用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瞧,2×2拼貼畫,您可以適應您的需求。請注意,在堆疊中傳遞的圖像必須是相同的或任何東西,只要尊重尺寸,就可以傳入任何圖像列表。

0

如果有人發現它很有用,下面是一個簡單的例子,它概括了@ bakkal的代碼,用於創建一個任意圖像數量的拼貼。它創建一個拼貼(爲了簡單起見,一個kxk正方形拼貼,並且所有圖像被假定爲具有相同大小 - ow,不要忘記調整圖像的大小!)從圖像目錄開始,首先水平堆疊圖像創建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 
相關問題