当前位置: 首页 > 科技观察

项目实战!如何用Python生成马赛克画

时间:2023-03-22 00:58:31 科技观察

你知道什么是马赛克画吗?不是动作片里的马赛克~~马赛克是由小图组成的大图。这篇文章的封面是我们的效果图。放大以查看详细信息。每幅都是一幅独立的画面,拼在一起组成一幅大画面,感觉就像一幅马赛克拼成的画,所以叫马赛克画。在网上看到一些马赛克画,觉得很酷,就用Python把一张原图转成了马赛克画。我们的效果图是这样的,原图是这样的。具体实现思路如下。第一步:先收集一组图片,这些图片将作为大图中的小方块图。图片越多,***生成的图片颜色越接近。Step2:将要转换的图片分成小方块图片,如下Step3:对于每张小方块图片,将其替换为图片集中最接近的图片。所有的小方块都被替换后,我们最后的马赛克就生成了。听起来很简单?下面我们来看一下具体的实现步骤。下面是一些核心代码。完整代码可在公众号后台回复“马赛克”获取。我们的图片集存在于images目录中。以下代码加载目录中的所有图像并将它们缩放为统一大小。这里load_all_images函数的参数是统一的尺寸,tile_row和tile_col分别对应高和宽。下面的代码对要转换的图像进行分割。我们将要转换的图像分成小方块。tile_row和tile_col是小方块的高和宽,roi访问的是小方块中的图像数据。下面是一个计算两张图片相似度的函数。im1和im2是两张图片的数据。图片数据是一个三维的numpy数组。这里我们将三维数组转化为一维数组,比较两者的欧氏距离。之后要找到最相似的图片,只需要遍历图片集中的所有图片,找到距离最短的图片,将原图片中的小方块替换掉即可。我们来看看最终的效果,将图片中的局部细节放大如下。如果对图片的质量不满意,想要更精细的图片质量,可以考虑在分割时将图片分割成更小的方块,但这也增加了程序的运行时间。生成图片的过程非常耗时。考虑到性能原因,原程序采用多进程并行处理。