三行代码把女朋友照片变成了素描图片!人生苦短,爱python多一些

我们知道图片除了最普通的彩×××,还有很多类型,比如素描,卡通,黑白等等,今天就介绍如何使用python和opencv来实现图片变素描图。

首先将彩×××转换成灰度图;

对灰度图进行求其反色的操作;

对第2步得到的结果采用一个高斯模糊的操作;

采用颜色亮化(color dodge)的技术将第一步的灰度图和第三步操作后的图片进行混合。

事先准备,首先是安装好 opencv,可以直接通过 pip 进行安装:

pip install opencv-python

接着准备一张图片,最好是颜色鲜明一点的图片,方便对比转换的效果。

如果大家想找一个Python学习环境,可以加入我们的Python学习圈:784758214 ,自己是一名高级python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、django、人工智能、机器学习等。送给正在学习python的小伙伴!每天会准时的讲一些项目实战案例,分享一些学习的方法和需要注意的小细节,,这里是python学习者聚集地

上面的代码是读取图片后,再通过调用 cv2.cvtColor 函数将图片转换成灰度图,实际上我们可以直接在读取图片时候就直接转换图片,即:

img_gray = cv2.imread(‘example.jpg‘, cv2.IMREAD_GRAYSCALE)

这里调用 cv2.imread 函数时,设置了 cv2.IMREAD_GRAYSCALE 的标志,表示加载灰度图。在imread 函数中是设置了三种标志,分别是

其实就是原本比较暗的地方变光亮了,而比较亮的地方变暗了。

第三步:高斯模糊

高斯模糊操作是一个有效减少图片噪音以及对图片进行平滑操作的方法,在数学上等价于对图像采用高斯核进行卷积的操作。我们可以直接调用 cv2.GaussianBlur 来实现高斯模糊操作,这里需要设置参数 ksize ,表示高斯核的大小, sigmaX 和 sigmaY 分别表示高斯核在 X 和 Y 方向上的标准差。

在现代图像编辑工具,比如 PS 可以实现上述说的两种技术。比如对于颜色亮化技术,给定一张图片 A 和 蒙版 B,那么实现做法如下所示:

(B[idx] == 255)?B[idx]:min(255, ((A[idx] << 8) / (255-B[idx])))

通过 python 代码实现上述公式,那么原始代码如下所示:

上述代码虽然实现了这个功能,但是很明显会非常耗时,中间采用了一个两层循环,计算复杂度是 O(w*h) ,也就是如果图片的宽和高的乘积越大,耗时就越长,所以就有了升级版的代码版本:

def dodgeV2(image, mask):

return cv2.divide(image, 255 - mask, scale=256)

运行上述代码,得到的最终结果如下所示:

效果看起来还可以,除了右下角部分对于原图中黑色区域处理得不是很好。

而另一种技术—-暗化操作的代码如下所示:

def burnV2(image, mask):

return 255 - cv2.divide(255 - image, 255 - mask, scale=256)

效果如下图所示:

完整版代码如下所示:

最后,还有一种更加快速的实现,代码如下所示,仅需四行代码即可实现转换成素描图的效果。

def rgb_to_sketch_v2(src_image_name):

img_gray = cv2.imread(src_image_name, 0)

img_blur = cv2.GaussianBlur(img_gray, (21, 21), 0, 0)

img_blend = cv2.divide(img_gray, img_blur, scale=256)

img_result = cv2.cvtColor(img_blend, cv2.COLOR_GRAY2BGR)

用一个女演员的照片来看看这个转换的效果:

好像。。昂,,还是彩色的好看

原文地址:https://blog.51cto.com/14304496/2385781

时间: 2024-07-30 08:00:29

三行代码把女朋友照片变成了素描图片!人生苦短,爱python多一些的相关文章

网吧随机三行代码蓝屏解决方案

网吧随机出现3行代码的蓝屏,这样的蓝屏是抓不到DUMP的,所以一直没有办法分析的,各种环境下都会出现,其他平台也发现的,当然这个也不是每个网吧都出现的,所以也会遇到有人说“隔壁老王家”就好的.出现这样的蓝屏一般是在结账下机.换机的时候:还有就是玩DNF中途掉线,然后在登陆就可能会蓝了. 经过联系DNF官方的人,回复说客户机BIOS里开启VT试下,因为腾讯的游戏在VT上有优化的,稳定性更好. 于是找了几个用户开启VT后,暂时没有发现这样的蓝屏了,另外一个用户机器本来就开启VT的,就没有发现过这样的

二分排序之三行代码

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include<stdio.h>  #include<stdlib.h>  int a[]={10,22,42,51,56,63,78,99,102,118};   int binSearch(int* a, int begin, int end, int k){      int mid = begin + ( (end - begin)>>1 ),index;      index

三行代码接入,社交软件打字时底下弹出的表情布局,自定义ViewPager+页面点标+各种功能的android小框架。

(转载请声明出处:http://www.cnblogs.com/linguanh/) 前言: 接上次分享的 ListView 动态加载类,入口:http://www.cnblogs.com/linguanh/p/4645115.html  这次分享给大家的是,刚些写好的类似社交软件打字时地下弹出的表情布局. 先看下我的默认效果图. 该效果图里面使用的图片资源,是默认的IC_lanucher,在我的类里面,你可以自定义,包括布局,几行几列,什么的,都可以自定义.底下的是小点标. 下集预告:我将在使

C# 防止同时调用=========使用读写锁三行代码简单解决多线程并发的问题

http://www.jb51.net/article/99718.htm 本文主要介绍了C#使用读写锁三行代码简单解决多线程并发写入文件时提示"文件正在由另一进程使用,因此该进程无法访问此文件"的问题.需要的朋友可以参考借鉴 在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三方日志插件,也可以选择使用数据库,还可以自己写个简单的方法把错误信息记录到日志文件. 选择最后一种方法实现的时候,若对文件操作与线程同步不熟悉,问题就有可能出现了,因为同一个文

“三行情书”——给你三行代码的爱恋~

去年社团搞过的一次活动,用三行代码来写情书~语言不限,语法也不一定严格遵守标准,今天整理了一下,以下是选手们的一些作品.平日里高冷的大神学霸们其实都是很有情怀的,在他(她)们眼中,爱你,只用三行来表达.(保留了原来的格式,去掉了作品中出现的姓名等) /**********************************************************/ do { a++; b++; } while(a & b); //我和你原本就是两个世界的人,一直都在不停的向前走. //直到有

180亿美元的三行代码

这几天,心目中的女神--大众给拉下了神坛,这是从美国传来尾气造假的事实,这份报告清晰地交待整个调查过程,以事实和证据说话.随后媒体并给出下面几行简单的代码来说明造假的过程: .mudge @dotMudge Basically, VW EPA cheat mode is: if(drive_wheels_moving && non_drive_wheels_stationary){ Enable_Dyno_mode(): 这三行代码非常简单,if语句就是C语言里判断语句,在判断条件里主要是

三行代码实现iOS9新功能-SFSafariViewController

我们直接来看完整的代码: import UIKit import SafariServices class ViewController: UIViewController { @IBAction func openWithSafariVC(sender: AnyObject) { let sfsVC = SFSafariViewController(URL: NSURL(string: "https://google.com")!) presentViewController(sfs

用MATLAB将照片合成视频或者GIF图片、以及Photoshop制作GIF图片

用MATLAB将照片合成视频或者GIF图片.以及Photoshop制作GIF图片 一.用MATLAB将照片合成视频(我使用的MATLAB是2015版本的) (1).你需要需要合成视频的图片. 所有照片放在一个文件夹里面因为是使用Matlab的dir函数读取照片,所以读取时,你要先设置好文件名:图片名称按照"001.002.003..."排列.否则图片显示顺序就会出错. 如果图片是用matlab在循环里使用saveas(gca,[Path,num2str(i)],'jpg');自动保存的

用代码实现将activity标题设置成图片

用代码实现将activity标题设置成图片. 01 @Override 02 public void onCreate(Bundle icicle) { 03 super.onCreate(icicle); 04 Window win = getWindow(); 05 win.requestFeature(Window.FEATURE_LEFT_ICON); 06 setContentView(R.layout.mylayout); 07 win.setFeatureDrawableResou