GOOGLE ADS

четверг, 14 апреля 2022 г.

Как объединить несколько изображений в одно изображение с помощью python

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

в этой функции создания коллажа я просто собираюсь создать коллаж 2x2 прямо сейчас.

def makecollage(image):
collage = Image.new("RGBA", (5000,2500), color=(255,255,255,255))
max = 8
l = list(range(0, max))
random.shuffle(l)
c=0
for i in range(0,1000,500):
for j in range(0,1000,500):

photo = image.resize((500,500))
collage.paste(photo, (i,j))
print(i,j)
c+=1
# Make a directory to save the collage image
collage.save("collage"+str(i+j)+".png")

через randomfile() я смог выбрать любой случайный файл внутри в подкаталогах, каждый подкаталог сейчас содержит только один файл.

def randomFile(directory):
files_list = os.listdir(directory)
random_num = random.choice(files_list)
img_1=Image.open((os.path.join(directory,random_num))).convert("RGBA")
if img_1 is not None:
images.append(img_1)
files_list.remove(random_num)
makecollage(img_1)
for x in directories[1:]:
randomFile(x)

Таким образом, коллаж отлично работает, когда все изображения находятся в одной папке.

введите описание изображения здесь

но когда изображения находятся в нескольких подпапках, оно повторяет последнее изображение во всех позициях коллажа.
введите описание изображения здесь


Решение проблемы

#вы должны разместить все изображения в строке + столбце #и вызвать функцию следующим образом:

import cv2
import NumPy as np
def stackImages(scale, imgArray):
rows = len(imgArray)
cols = len(imgArray[0])
rowsAvailable = isinstance(imgArray[0], list)
width = imgArray[0][0].shape[1]
height = imgArray[0][0].shape[0]
if rowsAvailable:
for x in range(0, rows):
for y in range(0, cols):
if imgArray[x][y].shape[:2] == imgArray[0][0].shape[:2]:
imgArray[x][y]=cv2.resize(imgArray[x][y],(0,0),None,scale,scale)
else:
imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0]
[0].shape[1], imgArray[0][0].shape[0]),
None, scale, scale)
if len(imgArray[x][y].shape) == 2: imgArray[x][y] =
cv2.cvtColor(imgArray[x][y], cv2.COLOR_GRAY2BGR)
imageBlank = np.zeros((height, width, 3), np.uint8)
hor = [imageBlank] * rows
hor_con = [imageBlank] * rows
for x in range(0, rows):
hor[x] = np.hstack(imgArray[x])
ver = np.vstack(hor)
else:
for x in range(0, rows):
if imgArray[x].shape[:2] == imgArray[0].shape[:2]:
imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)
else:
imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1],
imgArray[0].shape[0]), None, scale, scale)
if len(imgArray[x].shape) == 2: imgArray[x] =
cv2.cvtColor(imgArray[x],cv2.COLOR_GRAY2BGR)
hor = np.hstack(imgArray)
ver = hor
return ver

###... вызвать изображение по cv2

img1 = cv2.imread("Name_of_Image.Extention")
imgarray = ([img1, img2], [img3, img4])
stackImage = stackImages(0.3, imgarray)
cv2.imshow("img1", stackImage)

Спасибо

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...