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
aber wenn sich Bilder in mehreren Unterordnern befinden, wird das letzte Bild in allen Positionen der Collage wiederholt
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