用Python做个海量小姐姐素描图
素描作为一种近乎完美的表现手法有其独特的魅力,随着数字技术的发展,素描早已不再是专业绘画师的专利,今天这篇文章就来讲一讲如何使用python批量获取小姐姐素描画像。文章共分两部分:
第一部分介绍两种使用python生成素描画的思路
第二部分介绍如何批量获取素描画
1

获取素描图的两个思路
本部分介绍的两个思路都是基于opencv来实现,不涉及深度学习相关内容。基本思想是读入一张照片图,然后通过各种变换转化成素描图。为了演示方便,我们先找来一张小姐姐的照片作为实验素材。
1)漫画风格
先来说第一种方法,这种方法的核心思想是利用了名为“阈值化”的技术,这种技术是基于图像中物体与背景之间的灰度差异,而进行的像素级别的分割。
如果想要把一张图片转化为只呈现黑色和白色的素描图,就需要对其进行二值化操作,opencv中提供了两种二值化操作方法:threshold()和adaptiveThreshold()。相比threshold(),adaptiveThreshold()能够根据图像不同区域亮度分布进行局部自动调节,因此被称为自适应二值化。下面这幅图就是对彩色图片进行二值化操作后的效果。
上面提到的概念可能比较晦涩,不理解也没有关系,下面我们重点讲讲怎么进行实际操作。
第一步,读入图片并转化为灰度图。这一步算是常规操作了,相信使用过opencv的同学都写过类似的代码。
img_rgb = cv2.imread(src_image)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)
第二步,使用adaptiveThreshold()方法对图片进行二值化操作,函数中的参数大多用于设置自适应二值化的算法和阈值等。
img_edge = cv2.adaptiveThreshold(img_gray, 255,
cv2.ADAPTIVE_THRESH_MEAN_C,
cv2.THRESH_BINARY, blockSize=3, C=2)
第三步,保存转换后的图片
cv2.imwrite(dst_image, img_edge)
经过上述步骤的操作,我们得到了一幅新的黑白图片,一起来看看转换后的图片效果。
从转换后的图片来看,虽然大概轮廓没有问题,但是效果很不理想,并不能够称之为素描图。这主要是因为adaptiveThreshold()会在图片的每一个小的局部区域内进行二值化操作,因此对于一些清晰度比较高、色彩区分比较细腻的图片,就会出现上面这样密密麻麻的情况。
这个问题解决起来其实也很简单,只要在进行二值化之前加入下面这行代码对原图进行模糊化就可以了。
img_gray = cv2.medianBlur(img_gray, 5)
再来看看这次生成的素描图(下图),是不是看起来舒服多了,还有一种手绘漫画的感觉。
2)写实风格
通过上面这种方法,虽然最终也获得了一幅还算不错的素描图,但是看起来多少有些“失真”,为了获取看起来更加真实的素描图,我们尝试另外一种方法。
这种方法的核心思想是通过“底片融合”的方式获取原图中一些比较重要的线条,具体实现步骤如下:
第一步,跟上面的方法一样,使用opencv读取图片并生成灰度图。
第二步,对灰度图进行模糊化操作。经过试验,使用上面提到的中值滤波函数cv2.medianBlur()进行模糊化操作最终得到的素描图效果并不好,这里我们尝试使用高斯滤波进行图片模糊化,代码如下:
img_blur = cv2.GaussianBlur(img_gray, ksize=(21, 21),
sigmaX=0, sigmaY=0)
其中,参数ksize表示高斯核的大小,sigmaX和sigmaY分别表示高斯核在 X 和 Y 方向上的标准差。
第三步,使用cv2.divide()方法对原图和模糊图像进行融合,cv2.divide()本质上进行的是两幅图像素级别的除法操作,其得到的结果可以简单理解为两幅图之间有明显差异的部分。来看代码:
cv2.divide(img_gray, img_blur, scale=255)
第四步,保存生成的图片,代码跟上一个方法中一样,我们直接来看获取到的素描图效果。
从结果来看,这种方法获得的素描图线条更加细腻,素描效果也更好。
2
批量获取小姐姐素描画像
在这一部分,我们要实现批量获取小姐姐素描画像的功能,基于上文中两种素描图效果比对,这里采用第二种方法来实现图片到素描图的转换。
那么,接下来要解决的就是图片源的问题了。最近很多项目都成功实现了从抖音或者知乎获取漂亮小姐姐这一操作,其实除了这些平台之外还有好多网站能获取到漂亮小姐姐的图片。
网站的具体内容我就不在文中展示了,为了指定图片爬取的思路,大概讲下页面结构:网站的主页罗列了N个主题,每个主题页面中都包含了M张小姐姐的图片,结构示意图如下:
各页面url的构建也很明了,例如下图中的页面url是http://www.waxjj.cn/2794.html,其中2794就是主题页的ID号。查看页面的html代码(下图),发现每张图片都在一个<li>标签下面。
遇到这种情况,一般来说我们可以通过某种解析器来获取每张图片的url。但是,经过仔细观察发现整个网页的html代码中只有涉及图片url的部分带有完整的http连接,因此可以考虑使用正则表达式来提取图片url,实现这部分功能的代码如下。
在上面这段代码中,我们提取主题页的ID作为待保存图片名称的一部分,save_jpg()函数中会把每张图片转换为素描图并保存到本地。
由于我们要使用opencv对抓取到的图片进行各种运算转换,因此使用requests获取的图片必须先保存到本地,再用opencv重新读入后才行。基于上述思想,我们构建了如下所示的save_jpg()函数,其中rgb_to_sketch()函数是对上文第一部分中所说的第二种素描图的获取方法进行的封装。
而在主函数中,我们只需要指定想要获取主题页面的id号,构建一组url列表就可以了:
def main():
idlist = ['id1', 'id2']
urllist = ['http://www.waxjj.cn/'+x+'.html' for x in idlist]
jpgurls = get_jpg_urls(urllist)
以上就是完整代码,来看看运行后的效果吧~~
用Python做个海量小姐姐素描图的更多相关文章
- 微博爬虫,python微博用户主页小姐姐图片内容采集爬虫
python爬虫,微博爬虫,需要知晓微博用户id号,能够通过抓取微博用户主页内容来获取用户发表的内容,时间,点赞数,转发数等数据,当然以上都是本渣渣结合网上代码抄抄改改获取的! 要抓取的微博地址:ht ...
- python爬取快手小姐姐视频
流程分析 一.导入需要的三方库 import re #正则表表达式文字匹配 import requests #指定url,获取网页数据 import json #转化json格式 import os ...
- python做一个数独小游戏
最近看了下python的一些知识,在这里记载一下. 1.首先是安装,在官网下载最新的版本3.6,安装的时候要注意在下面勾选上ADD TO PATH,安装的时候会自动写入到环境变量里面,如果没有勾选,可 ...
- Python 抖音机器人,论如何在抖音上找到漂亮小姐姐?
只有想不到,没有做不到,最近抖音风靡好友圈,马上就有技术宅本着“代码改变世界”的理念开始了搞事之路. 需要注意的事,漂亮不漂亮没有明确的界限,每个人都有每个人的审美,只有外表而没有心灵的美也是空洞的. ...
- 刷抖音太累,教你用Python把高颜值的小姐姐都爬下来慢慢看
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 星安果.AirPython 目 标 场 景 相信大家平时刷抖音短视频 ...
- 用python实现在手机查看小姐姐的电脑在作什么!
看上心意的小姐姐,想看她平时都浏览什么网页,如何才能看她的桌面呢,都说Python很厉害,这次我们做一个利用移动端访问电脑来查看电脑的界面的神器!不知道大家以前有没有做过这方面的东西呢?也许大家听起来 ...
- 要不是真的喜欢学技术,谁会来用Python爬小姐姐啊
养成习惯,先赞后看!!!不用于任何商业价值,只是自己娱乐.否则 爬虫爬的好,牢饭吃到饱.这是我们这次爬取的网址:https://www.vmgirls.com/ 很多人学习python,不知道从何学起 ...
- 12岁的少年教你用Python做小游戏
首页 资讯 文章 频道 资源 小组 相亲 登录 注册 首页 最新文章 经典回顾 开发 设计 IT技术 职场 业界 极客 创业 访谈 在国外 - 导航条 - 首页 最新文章 经典回顾 开发 ...
- python 入门级教你如何拿到小姐姐微信
第一题: 首先错误的思路,首先找出 707829217/2+1 里面的所有奇数,然后再利用两个for,来判断 import math def func_get_prime(n): return ...
随机推荐
- Mysql增量备份之Mysqldump&Mylvmbackup
简单介绍 备份类型 备份方式 热备份:备份期间不需要服务停机,业务不受影响: 温备份:备份期间仅允许读的请求: 冷备份:备份期间需要关闭Mysql服务或读写请求都不受影响: 完全备份:full bac ...
- 桶排序(C语言)
#include <stdio.h> int main(void) { int arr[5]={2,5,1,3,3}; //定义需要排序的数组 int res[6]={0}; //初始化& ...
- canvas应用
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 数组类的创建——StaticArray.h
创建好的基于顺序存储结构的线性表存在两个方面的问题:1)功能上的问题:数组操作符的重载带来的问题,有可能线性表被无用为数组了,线性表被当做数组来使用了.2)效率方面的问题 本篇博客就要解决功能上的问题 ...
- java.lang.IllegalStateException: Cannot call sendError() after the response has been committe
1.问题描述 严重: Servlet.service() for servlet [default] in contextwith path [/OxygenCloud] threw exceptio ...
- ReactNative: 使用导航栏组件-NavigatorIOS组件和Navigator组件
一.简言 在软件开发中,不论是Web还是App,它们的应用程序都是由很多的功能视图组成的.对于这些组合的视图,如何实现页面间平滑地过渡,应用都有统一的一套跳转机制,这个功能就是路由或者叫导航.应用程序 ...
- Linux下shell脚本实现mongodb定时自动备份
MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功 ...
- JavaScript中使用正则表达式
JavaScript中正则表达式的使用 创建正则对象 RegExp 对象是带有预定义属性和方法的正则表达式对象. 方式一: var reg = new RegExp("\d", ' ...
- Linux下MySQL数据库的my.cnf配置文件,解决中文乱码问题
系统 CentOS 7.7 MySQL - 5.7.28文件放置目录:/etc/文件权限:644解决问题:存储中文数据乱码 # For advice on how to change settings ...
- 详解Condition的await和signal等待/通知机制
本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...