原创 菜鸟哥 菜鸟学Python 2020-10-22
收录于话题
#趣味Python
105个
点击上方“菜鸟学Python”,选“星标”公众号
重磅干货,第一时间到达
小编的舍友最近交了一个女朋友,是念艺术系的,擅长画画!长的好看又漂亮,舍友经常在我耳边吹嘘,女朋友画的油画多么漂亮。
哎。。。经常在我面前撒狗粮,真的是羡慕嫉妒恨呀。所以,小编今天也来画画,都说Python无所不能,今天就来秀一下如何把图片转化为油画效果。小编不仅给大家展示结果,还要用白话给大家解释背后的原理,嘿嘿!一起来看看吧!
01.程序原理
下图展示的是图片转为油画的原理。
02.具体怎么玩
首先,我们将整幅图进行灰度化,然后归一化到[0,buctsize]的范围内,bucksize的默认值是8;
然后,我们有一个模板,设置其大小为4,该模板就在原图上进行滑动,滑动的步长设置为step,默认为2;
接着,对于每一个模板,统计归一化后哪个像素值出现的次数最多,然后我们统计它出现的次数和它的像素值数值,上图中可以看到,出现最多的像素值是2,而它出现的次数是6。得到数值2和它出现的次数6之后,就将模板对应到原图中去;
最后,统计对应位置的原图像素值,并将其求均值,而均值作为像素值被填充到油画图当中;
经常上面几步,就实现了图片转油画图的算法
03.程序实现
那我们接下来看一下程序是如何实现的吧
首先,程序将图像转化为灰度图后又归一化到[0,bucksize]。然后就开始以step为步长,遍历整幅原图。
对于每一个模板,首先统计模板中像素值出现次数最多的那个像素值pix,和它出现的次数times,然后针对模板对应位置的原图,统计它的像素数值。
也就是说如果在模板中对应的像素值是pix的话,那么程序中bucketMean就加上对应的数值。最后将bucketMean除以times得到均值。
将均值写入到对应的油画位置。当整幅图遍历完成后,油画也便制作完毕了。
04.用flask进行网站展示
在进行完程序的讲解后,接下来小编就带领大家利用flask框架进行一个结果的展示。如下所示:
需要注意的是,由于程序需要对整幅图像进行遍历,所以在处理的时间上会比较缓慢,需要大家耐心的等待。大家也可以安装opencv-contrib-python,直接调用cv2.xphoto.oilPainting函数也可以实现图片转油画的效果。
需要源码的同学不要着急,如果上面的文章看的不过瘾,我们会在B站录制详细的视频给大家一行一行讲解原理。到时源码视频一起奉上!