python画史迪仔_手把手教你如何使用Python来生成马赛克画!

今天小伙伴问我,你知道什么是马赛克画,我笑了笑,你是说哪种哦?我知道一种,不过不是某些电影的马赛克哦~~

aa46db2368d2b2f8

马赛克画是一张由小图拼成的大图,本文的封面就是我们的效果图,放大看细节,每一块都是一张独立的图片,拼在一起组成一张大图,感觉像是用马赛克拼出来的画,所以叫马赛克画。看到网上的一些马赛克画觉得很酷,于是自己用Python实现了一下将一张原图转换成马赛克画。

封面的原图是这样的

b8d6c02b0e8df375

实现的具体思路是这样

第一步:首先收集一组图片,这些图片会作为大图中的小方格图片。图片越多,最后生成的图片颜色越接近。

第二步:将要转换的图片分割成一个一个小方格图片,像下面这样

f6d84a47a469b2b6

第三步:对于每一个小方格图片,取图片集里面最接近的图片替换。所有小方格都替换后,就生成了我们最终的马赛克画。

听上去是不是很简单?

我们来看一下具体的实现步骤,下面是一些核心代码。完整代码可在公众号【Python与数据分析】后台回复“mosaic”获取。

我们的图片集存在images目录下,下面的代码加载目录下所有的图片,并缩放成统一的尺寸

importreimportosimportcv2importnumpyasnpfromtqdmimporttqdmIMG_DIR="images"def load_all_images(tile_row, tile_col): img_dir =IMG_DIRfilenames = os.listdir(img_dir)result= [] print(len(filenames))forfilenameintqdm(filenames):ifnotre.search(".jpg", filename, re.I):continuetry: filepath = os.path.join(img_dir, filename) im = cv2.imread(filepath) row = im.shape[0] col = im.shape[1] im = resize(im, tile_row, tile_col)result.append(np.array(im))exceptExceptionase: msg ="error with {} - {}".format(filepath, str(e)) print(msg)returnnp.array(result, dtype=np.uint8)

这里load_all_images函数的参数就是统一后的尺寸,tile_row和tile_col分别对应高和宽。

下面的代码对要转换的图片进行分割

img = cv2.imread(infile)tile_row, tile_col = get_tile_row_col(img.shape)forrowinrange(0, img_shape[0], tile_row):forcolinrange(0, img_shape[1], tile_col): roi = img[row:row+tile_row,col:col+tile_col,:]

我们将要转换的图片分割成一个个小方格,tile_row和tile_col是小方格的高和宽,roi存取小方格中的图片数据。

下面是计算两张图片相似度的函数

from scipy.spatial.distanceimporteuclideandef img_distance(im1, im2):ifim1.shape!= im2.shape: msg ="shapes are different {} {}".format(im1.shape, im2.shape) raise Exception(msg) array1 = im1.flatten() array2 = im2.flatten()dist= euclidean(array1, array2)returndist

im1和im2是两张图片的数据,图片数据是一个三维的numpy数组,这里我们将三维数组转换成一维数组后,比较两者的欧式距离。之后要找出最相似的图片,只需遍历图片集中所有的图片,找到距离最短的那张图片,去替换原图中的小方格就可以了。

我们再来看一下最终实现的效果

8ec16177c2350625

放大图中局部的细节如下

4423c9f8bc9039ff

如果对图片的画质不满意,想要更精细的画质,可以考虑在分割的时候把图片分割成更小的方格,不过这样也会增加程序运行的时间。

生成图片的过程比较耗时,考虑到性能原因,原程序中使用多进程的方式并行处理。

经过以上的学习,你学会了如何使用Python生成马赛克画了吗?

为了让大家更好地更快速的学习Python,小编准备来一份适合Python初学者的系统入门学习资料,加群959997225即可领取。

本文来自网络,如有侵权请联系小编删除!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种广泛应用于编程和数据分析的高级编程语言,它提供了许多强大的绘图功能,可以用来出各种各样的图形和图像,包括史迪仔。 要用Python画史迪仔,首先需要准备一个绘图的库,比如matplotlib或者PIL(Python Imaging Library)。这些库提供了丰富的绘图函数和方法,可以帮助我们绘制出所需的图形。 为了史迪仔,我们可以先在绘图区域创建一个空白布,然后通过绘图函数一点一点地添加笔和颜色,逐渐绘制出史迪仔的轮廓和特征。 史迪仔的轮廓和特征可以通过绘制直线、曲线、图形等方式来实现。例如,我们可以使用直线函数来画史迪仔的身体、四肢和眼睛,使用曲线函数来画史迪仔的胡须和嘴巴,使用图形函数来填充史迪仔的颜色。 在画史迪仔时,我们还可以运用一些绘图技巧和方法,使得绘制的图像更加生动和逼真。例如,可以利用阴影和渐变效果来增加史迪仔的立体感,使用细节笔来表达史迪仔的毛发和纹理。 当好了史迪仔后,我们可以通过保存或者显示的方式来展示绘制的结果。可以将史迪仔保存为图片文件,或者直接在程序中显示出来。 总之,Python提供了丰富的绘图功能,可以用来出各种各样的图形和图像,包括史迪仔。通过利用绘图库和一些绘图技巧,我们可以实现绘制出具有立体感和逼真度的史迪仔图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值