// объявление bibliio
from PIL import Image, ImageDraw
import numpy as np
import cv2
import math
import glob
moyenne_color = []
im1 = Image.open('1.jpg')
size=50
images = []
avg_colors = []
// альбом изображений parcourir les
path = './image_album'
for image_path in glob.glob("{}/*.jpg".format(path)):
image = cv2.imread(image_path )
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = cv2.resize(image, (size, size))
images.append(image)
avg_colors.append(np.sum(np.sum(image, axis=0), axis=0) / (size ** 2))
images = images
avg_colors = np.array(avg_colors)
def Hexagone(image_width, image_height):
#hauteur de l'hexagone 1/2
h = math.sin(math.pi / 3)
for x in range(-1, image_width, 3):
for y in range(-1,int(image_height / h )):
decalage_horizental_x = int(x) if (y % 2 == 0) else x + 1.5
y =int(y)
h= int(h+0.5)
yield [(decalage_horizental_x, y * h),(decalage_horizental_x + 1, y * h),(decalage_horizental_x + 1.5, (y + 1) * h),(decalage_horizental_x + 1, (y + 2) * h),(decalage_horizental_x, (y + 2) * h),(decalage_horizental_x - 0.5, (y + 1) * h),]
// генератор шестиугольных координат
def coordonnees_polygone(generer_coords, image_width, image_height, tile_length=50 ):
largeur = int(image_width / tile_length) +2
longeur = int(image_height / tile_length) +2
for coordonnees in generer_coords(largeur, longeur):
yield [ (x * tile_length, y * tile_length) for (x, y) in coordonnees]
def generer_polygone(*args):
return coordonnees_polygone(Hexagone, *args)
// сетка генератора mosai c
def mosaic_grid(coordonnees):
for polygone in coordonnees(im1.size[0] , im1.size[1]):
area = (polygone[0][0] , polygone[0][1],polygone[1][0]+100 , polygone[1][1]+100)
cropped_img = im1.crop(area)
moyenne_color1 = np.array(cropped_img.getpixel( ( 5 , 5) ))
distance_matrix = np.linalg.norm(moyenne_color1 - avg_colors, axis=1)
idx = np.argmin(distance_matrix)
В этой части у меня есть проблема с изменением размера маски
, поэтому как вставить все изображение без обрезки
mask = Image.new("L", im1.size, 0)
draw = ImageDraw.Draw(mask)
draw.polygon(polygone, outline='black', fill=255 )
ImageDraw.Draw(im1).polygon(polygone,outline='black' )
i=Image.fromarray(images[idx],"RGB")
i = i.resize(im1.size)
im1.paste(i,mask=mask)
im1.show()
im1.save('hexagone.png')
mosaic_grid(generer_polygone)
вуаля: результат выдачи сгенерировать сетку mosai c с шестигранной формой