проблема вставить изображение в ячейку с шестигранной формой, как создать это изображение mosai c без изменения размера изображения или обрезки на python? - PullRequest
0 голосов
/ 30 апреля 2020

// объявление 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 с шестигранной формой

...