How to compose multiple pictures into a mosaic picture by Python
This article will explain in detail how Python can synthesize multiple images into a mosaic image. Xiaobian thinks it is quite practical, so share it with you as a reference. I hope you can gain something after reading this article.
picture material
4K HD original
development environment
Python 3.6
Pycharm
import cv2import globimport argparseimport numpy as npfrom tqdm import tqdm #progress bar from itertools import product #iterator reads image file def parsArgs(): parser = argparse.ArgumentParser ('mosaic picture') parser.add_argument ('--targetpath', type=str, default ='examples/3.jpg ', help ='target image path') parser.add_argument ('--outputpath', type=str, default ='output.jpg ', help ='output image path') parser.add_argument ('--sourcepath', type=str, default ='sourceimages ', help ='all source image file paths used to stitch images') parser.add_argument ('--blocksize', type=int, default=15, help ='mosaic block size') args = parser.parse_args() return args Read all source images and calculate the color average def readSourceImages(sourcepath,blocksize): print ('Start reading image') List of legal images
Set up a list of color images that meet the requirements
sourceimages = [] averagecolorlistavgcolors = [] traversal
Every time you traverse, the progress bar goes once
for path in tqdm(glob.glob("{}/*.jpg".format(sourcepath))): image = cv2.imread(path, cv2.IMREAD_COLOR) if image.shape[-1] != 3: continue #Scale size image = cv2.resize(image, (blocksize, blocksize)) #Image Color Average avgcolor = np.sum(np.sum(image, axis=0), axis=0) / (blocksize * blocksize) sourceimages.append(image) avgcolors.append(avgcolor)print ('finish reading') return sourceimages,np.array(avgcolors) main function def main(args): targetimage = cv2.imread(args.targetpath) outputimage = np.zeros(targetimage.shape,np.uint8) # int8 int16 int32 int64 sourceimages,avgcolors = readSourceImages(args.sourcepath,args.blocksize) print ('Start Production') for i, j in tqdm(product(range(int(targetimage.shape[1]/args.blocksize)), range(int(targetimage.shape[0]/args.blocksize)))): block = targetimage[j * args.blocksize: (j + 1) * args.blocksize, i * args.blocksize: (i + 1) * args.blocksize,:] avgcolor = np.sum(np.sum(block, axis=0), axis=0) / (args.blocksize * args.blocksize) distances = np.linalg.norm(avgcolor - avgcolors, axis=1) idx = np.argmin(distances) outputimage[j * args.blocksize: (j + 1) * args.blocksize, i * args.blocksize: (i + 1) * args.blocksize, :] = \ sourceimages[idx] cv2.imwrite(args.outputpath, outputimage) cv2.imshow('result', outputimage) print ('finished ') module call execution if __name__= '__main__': # run main(parseArgs()) Full effect
About "Python how to achieve multiple images into a mosaic image" This article is shared here, I hope the above content can be of some help to everyone, so that you can learn more knowledge, if you think the article is good, please share it for more people to see.