Вставить изображения вместе, используя имена файлов в качестве позиций - PullRequest
0 голосов
/ 09 мая 2019

У меня есть куча jpeg изображений, которые я хочу присоединить к определенной позиции после ее имени файла.Примеры имен файлов:

7_1.jpeg -> Это изображение должно быть вставлено в 7-ю строку, 1-й столбец

15_5.jpeg -> Это изображение должно быть вставлено в 15-ю строку, 5-й столбец

и т. Д.

В этом случае имена файлов варьируются от 1_1.jpeg до 40_20.jpeg, но я хотел бы объединить любое количество изображений.

Конечное изображение будет содержать пустые ячейки, поскольку не во всех позициях есть изображение.

Ближайший пост для моих целей, который я нашел, это: https://stackoverflow.com/a/42853439/8252488

ОБНОВЛЕНИЕ: Я попробовал другой вариант, и теперь я могу вставлять разные изображения в определенных позицияхиспользуя:

import cv2
import numpy
import glob
import os

dir = "." # current directory
ext = ".jpg" # whatever extension you want

pathname = os.path.join(dir, "*" + ext)
images = [cv2.imread(img) for img in glob.glob(pathname)]

height = sum(image.shape[0] for image in images)
width = max(image.shape[1] for image in images)
output = numpy.zeros((height,width,3))

y = 0
for image in images:
    h,w,d = image.shape
    output[y:y+h,0:w] = image
    y += h

cv2.imwrite("test.jpg", output)

из здесь

Теперь я пытаюсь указать позиции, используя имена файлов, следующим образом:

pathname = os.path.join(dir, "*" + ext)
images = [cv2.imread(img) for img in glob.glob(pathname)]
names = [img for img in glob.glob(pathname)]
#Get filenames from paths
files = [re.sub("/.*/", "", x) for x in names]
#Get positions
position = [re.sub(".jpeg", "", x) for x in files]
#Get hight position and tranform to int
height = [re.sub("_.*", "", x) for x in position]
height2 = [int(i) for i in height]
#Get width position and tranform to int
width = [re.sub(".*_", "", x) for x in position]
width2 = [int(i) for i in width]
#Generate background image
height_tot = 280*max(height2) #All images are 280*280
width_tot = 280*max(width2)
output = numpy.zeros((height_tot,width_tot,3))
#Locate images
for name, image in zip(names,images):
        files = re.sub("/.*/", "", name)
        position = re.sub(".jpeg", "", files)
        height = re.sub("_.*", "", position)
        height2 = int(height)*280
        width = re.sub(".*_", "", position)
        width2 = int(width)*280
        output[height2:height2+280,width2:width2+280] = image
cv2.imwrite("test.jpg", output)

Я знаюэто очень далеко от чистоты, но на данный момент я хочу, чтобы все работало.Однако я получил следующую ошибку:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-70-529c37a03571> in <module>()
      6     width = re.sub(".*_", "", position)
      7     width2 = int(width)*280
----> 8     output[height2:height2+280,width2:width2+280] = image
      9 #    print(height2)
     10 cv2.imwrite("test.jpg", output)

ValueError: could not broadcast input array from shape (280,280,3) into shape (0,280,3)

Есть идеи, чего не хватает?Спасибо!

UPDATE2 Если я изменю 280 на 262, то у меня не будет ошибки, но изображение не очень хорошо организовано.На самом деле я обнаружил, что патчи на самом деле вставляются более одного раза.Код:

for name, image in zip(names,images):
    h,w,d = image.shape
    files = re.sub("/.*/", "", name)
    position = re.sub(".jpeg", "", files)
    height = re.sub("_.*", "", position)
    height2 = int(height)*262
    width = re.sub(".*_", "", position)
    width2 = int(width)*262
    output[height2:height2+h,width2:width2+w,:] = image

cv2.imwrite("test.jpg", output)

Badly arranged image

1 Ответ

0 голосов
/ 22 мая 2019

После некоторой борьбы я наконец-то получил то, что искал.Я просто добавлю код, который работал для меня, на случай, если кому-то понадобится что-то подобное.Я знаю, что код не чистый, но он работает: -P

pathname = os.path.join(dir, "*" + ext)
images = [cv2.imread(img) for img in glob.glob(pathname)]
names = [img for img in glob.glob(pathname)]
#Get filenames from paths
files = [re.sub("/.*/", "", x) for x in names]
#Get positions
position = [re.sub(".jpeg", "", x) for x in files]
#Get hight position and tranform to int
height = [re.sub("_.*", "", x) for x in position]
height2 = [int(i) for i in height]
#Get width position and tranform to int
width = [re.sub(".*_", "", x) for x in position]
width2 = [int(i) for i in width]
#Generate background image
height_tot = 280*max(height2) #All images are 280*280
width_tot = 280*max(width2)
output = numpy.zeros((height_tot+280,width_tot+280,3))
#Locate images
for name, image in zip(names,images):
    h,w,d = image.shape
    files = re.sub("/.*/", "", name)
    position = re.sub(".jpeg", "", files)
    height = re.sub("_.*", "", position)
    height2 = int(height)*280
    width = re.sub(".*_", "", position)
    width2 = int(width)*280
    output[width2:width2+280,height2:height2+280] = image

cv2.imwrite("test_processed.jpg", output)

Вы увидите, что единственным отличием от предыдущего кода является то, что я добавил 280 по каждой оси, потому что внешние патчи не подходили.Я также поменял ось для лучшего отображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...