Rudimentary idea to discover where a puzzle piece would fit (OpenCV)
I was doing a puzzle and I had this idea to have fun with OpenCV. There are many other things that should be done before having a proper solution, but it was good enough at that time.
Split the puzzle
import numpy
from PIL import Image
square = 600
image = Image.open('santa_full.png')
width, height = image.size
for y in range(0, height, square):
for x in range(0, width, square):
image_cropped = image.crop((x, y, x+square, y+square)).convert('RGB')
pixels = image_cropped.getdata()
image_cropped.save("images/{}-{}.png".format(x/square, y/square), "PNG")
Discover where a piece would fit
import cv2
method = cv2.TM_SQDIFF_NORMED
# Read the images from the file
small_image = cv2.imread('images_puzzle_find_piece.png')
large_image = cv2.imread('images_puzzle_find_full.jpg')
result = cv2.matchTemplate(small_image, large_image, method)
# We want the minimum squared difference
mn,_,mnLoc,_ = cv2.minMaxLoc(result)
# Draw the rectangle: Extract the coordinates of our best match
MPx,MPy = mnLoc
# Step 2: Get the size of the template. This is the same size as the match.
trows,tcols = small_image.shape[:2]
# Step 3: Draw the rectangle on large_image
cv2.rectangle(large_image, (MPx,MPy),(MPx+tcols,MPy+trows),(0,0,255),2)
cv2.imwrite('result.jpg', large_image)