114 lines
3.4 KiB
Python
114 lines
3.4 KiB
Python
from PIL import Image
|
|
|
|
image = Image.open("shuffle.png").convert("RGB")
|
|
X = 23
|
|
Y = 13
|
|
TOLERANCE = 20
|
|
|
|
def get_bordures(img):
|
|
width, height = img.size
|
|
left = list()
|
|
top = list()
|
|
right = list()
|
|
bottom = list()
|
|
for x in range(width):
|
|
top.append(img.getpixel((x, 0)))
|
|
bottom.append(img.getpixel((x, height-1)))
|
|
for y in range(height):
|
|
left.append(img.getpixel((0, y)))
|
|
right.append(img.getpixel((width-1, y)))
|
|
return left, top, right, bottom
|
|
|
|
def compare_bordure(b1, b2):
|
|
res = 0
|
|
for i in range(len(b1)):
|
|
res += abs(b1[i][0] - b2[i][0]) + abs(b1[i][1] - b2[i][1]) + abs(b1[i][2] - b2[i][2])
|
|
return res//len(b1)/3*100/256
|
|
|
|
width, height = image.size
|
|
w = width//X
|
|
h = height//Y
|
|
|
|
solution = Image.new("RGB", (width*2, height))
|
|
|
|
#create many small images
|
|
table = list()
|
|
for i in range(X*Y):
|
|
img = Image.new("RGB", (w, h))
|
|
x = (i//Y)*w
|
|
y = (i%Y)*h
|
|
tmp = image.crop((x, y, x+w, y+h))
|
|
img.paste(tmp)
|
|
left, top, right, bottom = get_bordures(img)
|
|
table.append((img, left, top, right, bottom))
|
|
|
|
############################Try to find upper left image
|
|
# bordure_left_candidates = dict()
|
|
# for i in range(len(table)):
|
|
# best = 100
|
|
# for j in range(len(table)):
|
|
# comp = compare_bordure(table[i][1], table[j][3])
|
|
# if comp < best:
|
|
# best = comp
|
|
# bordure_left_candidates[i] = best
|
|
# print(bordure_left_candidates)
|
|
# print(max(bordure_left_candidates, key=bordure_left_candidates.get))
|
|
|
|
##############################Try to find top, bottom, left and right
|
|
# i = 5
|
|
# best_left = (None, 100)
|
|
# best_top = (None, 100)
|
|
# best_right = (None, 100)
|
|
# best_bottom = (None, 100)
|
|
# for j in range(len(table)):
|
|
# comp = compare_bordure(table[i][2], table[j][4])
|
|
# if comp < best_top[1]:
|
|
# best_top = (j, comp)
|
|
# comp = compare_bordure(table[i][4], table[j][2])
|
|
# if comp < best_bottom[1]:
|
|
# best_bottom = (j, comp)
|
|
# comp = compare_bordure(table[i][1], table[j][3])
|
|
# if comp < best_left[1]:
|
|
# best_left = (j, comp)
|
|
# comp = compare_bordure(table[i][3], table[j][1])
|
|
# if comp < best_right[1]:
|
|
# best_right = (j, comp)
|
|
|
|
# if best_top[1] < TOLERANCE:
|
|
# solution.paste(table[best_top[0]][0], (w, 0))
|
|
# if best_left[1] < TOLERANCE:
|
|
# solution.paste(table[best_left[0]][0], (0, h))
|
|
# solution.paste(table[i][0], (w, h))
|
|
# if best_right[1] < TOLERANCE:
|
|
# solution.paste(table[best_right[0]][0], (w*2, h))
|
|
# if best_bottom[1] < TOLERANCE:
|
|
# solution.paste(table[best_bottom[0]][0], (w, h*2))
|
|
|
|
# solution.show()
|
|
|
|
|
|
##########################Try to find full rows
|
|
# table[10*13+5][0].show()
|
|
|
|
for k in (38, 19, 80, 81, 238, 31, 83, 73, 135, 232, 86):
|
|
i = k
|
|
print(i)
|
|
solution.paste(table[i][0], (width,0))
|
|
for x in range(1, X+1):
|
|
best_right = (None, 100)
|
|
for j in range(len(table)):
|
|
comp = compare_bordure(table[i][3], table[j][1])
|
|
if comp < best_right[1]:
|
|
best_right = (j, comp)
|
|
solution.paste(table[best_right[0]][0], (width+x*w,0))
|
|
i = best_right[0]
|
|
i = k
|
|
for x in range(1, X+1):
|
|
best_left = (None, 100)
|
|
for j in range(len(table)):
|
|
comp = compare_bordure(table[i][1], table[j][3])
|
|
if comp < best_left[1]:
|
|
best_left = (j, comp)
|
|
solution.paste(table[best_left[0]][0], (width-x*w,0))
|
|
i = best_left[0]
|
|
solution.show() |