Lets try PIL to first downscale the image massively to a given kernel size, then upscale with NEAREST back to the same size -
from PIL import Image
from numpy import asarray
img = Image.open("van_gogh.jpg", mode='r')
factor = 100
kernel = (img.height//factor, img.width//factor)
pixelated = img.resize(kernel,resample=Image.BICUBIC) #downsample
pixelated = pixelated.resize(img.size,Image.NEAREST) #upsample
#Grids
grid_color = [255,255,255]
dx, dy = factor, factor
g = np.asarray(pixelated).copy()
g[:,::dy,:] = grid_color
g[::dx,:,:] = grid_color
pixelated2 = Image.fromarray(g)
pixelated2

Increasing the factor here, will pixelate the image further.
factor = 100
