原创 菜鸟哥 菜鸟学Python 2020-10-22

收录于话题

#趣味Python

105个

点击上方“菜鸟学Python”,选“星标”公众号

重磅干货,第一时间到达

小编的舍友最近交了一个女朋友,是念艺术系的,擅长画画!长的好看又漂亮,舍友经常在我耳边吹嘘,女朋友画的油画多么漂亮。

哎。。。经常在我面前撒狗粮,真的是羡慕嫉妒恨呀。所以,小编今天也来画画,都说Python无所不能,今天就来秀一下如何把图片转化为油画效果。小编不仅给大家展示结果,还要用白话给大家解释背后的原理,嘿嘿!一起来看看吧!


01.程序原理

下图展示的是图片转为油画的原理。

Python也能成为毕加索?我用Python给小姐姐画了幅油画_Python


02.具体怎么玩


  • 首先,我们将整幅图进行灰度化,然后归一化到[0,buctsize]的范围内,bucksize的默认值是8;

  • 然后,我们有一个模板,设置其大小为4,该模板就在原图上进行滑动,滑动的步长设置为step,默认为2;

  • 接着,对于每一个模板,统计归一化后哪个像素值出现的次数最多,然后我们统计它出现的次数和它的像素值数值,上图中可以看到,出现最多的像素值是2,而它出现的次数是6。得到数值2和它出现的次数6之后,就将模板对应到原图中去;

  • 最后,统计对应位置的原图像素值,并将其求均值,而均值作为像素值被填充到油画图当中;


经常上面几步,就实现了图片转油画图的算法


03.程序实现


那我们接下来看一下程序是如何实现的吧

Python也能成为毕加索?我用Python给小姐姐画了幅油画_Python_02


首先,程序将图像转化为灰度图后又归一化到[0,bucksize]。然后就开始以step为步长,遍历整幅原图。

Python也能成为毕加索?我用Python给小姐姐画了幅油画_Python_03

对于每一个模板,首先统计模板中像素值出现次数最多的那个像素值pix,和它出现的次数times,然后针对模板对应位置的原图,统计它的像素数值。


也就是说如果在模板中对应的像素值是pix的话,那么程序中bucketMean就加上对应的数值。最后将bucketMean除以times得到均值。


将均值写入到对应的油画位置。当整幅图遍历完成后,油画也便制作完毕了。


04.用flask进行网站展示


在进行完程序的讲解后,接下来小编就带领大家利用flask框架进行一个结果的展示。如下所示:



需要注意的是,由于程序需要对整幅图像进行遍历,所以在处理的时间上会比较缓慢,需要大家耐心的等待。大家也可以安装opencv-contrib-python,直接调用cv2.xphoto.oilPainting函数也可以实现图片转油画的效果。


需要源码的同学不要着急,如果上面的文章看的不过瘾,我们会在B站录制详细的视频给大家一行一行讲解原理。到时源码视频一起奉上!