GOOGLE ADS

Dienstag, 26. April 2022

Wie man mehrere Bilder mit Python zu einem Bild kombiniert

Ich versuche, eine Bildcollage aus mehreren Bildern zu erstellen, konnte erfolgreich aufbauen, wenn sich alle Bilder in einem einzigen Ordner befinden, aber das Problem ist, dass, wenn sich die Bilder in mehreren Ordnern befinden, die Collage nicht perfekt zu ihrer einzigen Speicherung wird das letzte Bild in allen Positionen der Collage.

Innerhalb dieser Funktion zum Erstellen von Collagen erstelle ich gerade eine 2x2-Collage.

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")

Durch die randomfile() konnte ich jede zufällige Datei in den Unterverzeichnissen auswählen, jedes Unterverzeichnis enthält derzeit nur eine Datei.

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)

Die Collage funktioniert also perfekt, wenn sich alle Bilder in einem einzigen Ordner befinden

Geben Sie hier die Bildbeschreibung ein

aber wenn sich Bilder in mehreren Unterordnern befinden, wird das letzte Bild in allen Positionen der Collage wiederholt
Geben Sie hier die Bildbeschreibung ein


Lösung des Problems

#Sie sollten alle Bilder in einer Zeile + Spalte platzieren #und die Funktion so aufrufen:

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

###... Rufen Sie das Bild mit cv2 auf

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

Vielen Dank

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...