本次分享本科阶段用Python爬取彩色图像的一个案例--彩色图像变素描,主要有以下两个目的
(1)批量爬取彩色图像,并将其保存在某一文件夹下。
(2)读取保存在文件夹下的彩色图像,利用 python 编程将其变为素描图像,并保存。
一. 爬取彩色图像
爬取彩色图像
并保存在给定的文件夹中, 如图所示:
![](https://img-blog.csdnimg.cn/direct/94e7a1f818c149508704d725d9adcbcb.png)
某一张彩色图片如图所示:
![](https://img-blog.csdnimg.cn/direct/7fb20d7a99364019adf416d3b1002d63.jpeg)
二. 转化素描图像
(1) 首先,利用 PIL 库中的 Image 读取图像,图像类型为 Image,模式(Mode)为 RGB,
如图所示:
(2) 其次,
将 RGB 图转化为灰度图,灰度图如图所示:
(3) 接着,将灰度图进行反色操作,即 255-当前像素点,反色图像如图所示:
![](https://img-blog.csdnimg.cn/direct/13d8d59f315c47899e79761a13e291d5.png)
(4) 对步骤 (3)(即反色图像)中的图片进行高斯模糊 Gaussian blur,即能够很有
效地减少图像中的噪声,将图像变得更加平滑一点。高斯模糊图像如图所示:
![](https://img-blog.csdnimg.cn/direct/c1ad126beddb49098fafb4d8d2ef6270.png)
(5)
将步骤(2)中的灰度图像和步骤(4)中的模糊反色图像混合并批量保存,如图所示:
![](https://img-blog.csdnimg.cn/direct/4293dcd069674f31a4c02a385854a6a9.png)
某一张素描图像如图所示:
![](https://img-blog.csdnimg.cn/direct/1cb4dd7ce906484db209261ef3dccb69.jpeg)
三. 完整代码
import urllib.request
import re
import requests
from PIL import Image, ImageFilter, ImageOps
#第一步:获取图片
url = 'https://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&dyTabStr=MCwzLDYsMSw0LDUsOCw3LDIsOQ%3D%3D&word=%E5%93%86%E5%95%A6A%E6%A2%A6'
#定义请求头
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36",
"Cookie":"winWH=%5E6_1280x575; BDIMGISLOGIN=0; BDqhfp=%E5%93%86%E5%95%A6A%E6%A2%A6%26%26NaN-1undefined%26%260%26%261; BIDUPSID=460CE6AEB89DF490ECA08379659DB608; PSTM=1596360800; __yjs_duid=1_b3fb830303ec762d08baacb9d1b59e3f1619839506447; BAIDUID=E1CD549AE974D26F59AA61224DCEAAB0:FG=1; BDUSS=9vSDd0bzFFSmRYbE9Xfm1kNkdrUDg3MEhQYTRnUllTZWhvNzZ2QUk2U0tDY2xoRVFBQUFBJCQAAAAAAAAAAAEAAABftu81bWXesd6xveMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp8oWGKfKFhLU; BDUSS_BFESS=9vSDd0bzFFSmRYbE9Xfm1kNkdrUDg3MEhQYTRnUllTZWhvNzZ2QUk2U0tDY2xoRVFBQUFBJCQAAAAAAAAAAAEAAABftu81bWXesd6xveMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp8oWGKfKFhLU; H_PS_PSSID=31254_26350; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; firstShowTip=1; cleanHistoryStatus=0; indexPageSugList=%5B%22%E5%93%86%E5%95%A6A%E6%A2%A6%22%2C%22python%E7%88%AC%E5%8F%96%E5%8A%A8%E6%80%81%E7%BD%91%E9%A1%B5%E5%9B%BE%E7%89%87%E9%BB%98%E8%AE%A4%E5%8F%AA%E8%83%BD%E7%88%AC%E5%8F%9630%E4%B8%AA%E5%90%97%22%2C%22python%E7%88%AC%E5%8F%96%E5%8A%A8%E6%80%81%E7%BD%91%E9%A1%B5%E5%9B%BE%E7%89%87%E5%8F%AA%E8%83%BD%E7%88%AC%E5%8F%9630%E4%B8%AA%E5%90%97%22%2C%22python%E7%9A%84%E7%BC%96%E7%A0%81%E6%A0%BC%E5%BC%8F%22%2C%22client.licensePlate%22%2C%22%20opencv_python-4.1.0-cp36-cp36m-win_amd64.whl%20is%20not%20a%20supported%20wheel%20on%20this%20platform.%22%2C%22%E7%8C%AB%E5%92%AA%E5%9B%BE%E7%89%87%22%2C%22%E7%8C%AB%22%2C%22%E8%BD%A6%E7%89%8C%22%5D; ab_sr=1.0.1_ZWRkNjBhNGE3YWQxY2RkZTQ0MWRlYTI0ZTI2OTI0M2FlMzIxYTUyMzc1MjA5Y2U1Nzg3M2M2MTU3ZWZjMDFiZWEwMmRmOGQzNjRiNjcyMWZkNGRkZDZhNmE2ZGJlNGU0MGFiNWNiNTg3OWZiNTA4ZmJhMzE2NzY3YzE5MTU3ODFhNWM3NTgzYjRlYWE3MzVhNGE5YmMzY2RiYzhmYzhhODY0Y2E1OWVhYzVlODNhM2VhMTY0MDgzNzAyY2Y5MjE2; delPer=0; PSINO=1; BA_HECTOR=a4a185ah8l0k010g8q1gqgacj0r; BAIDUID_BFESS=95C65C6D0A445702EB4564D0DF852ED8:FG=1",
}
#发送get请求
response = requests.get(url,headers=headers)
#对response对象解码
content = response.content.decode('utf8')
#进行数据提取(Ctrl+F):thumbURL
detail_urls = re.findall('"thumbURL":"(.*?)"',content,re.DOTALL)
#图片的下载
i = 0
for detail_url in detail_urls:
#得到哆啦A梦的图片的响应
response = requests.get(detail_url,headers=headers)
#得到哆啦A梦的图片的内容
content = response.content
with open('彩色图像\\{}.jpg'.format(i),'wb') as f:
f.write(content)
i+=1
#第二步:彩色变素描
for k in range(174):
img = Image.open('彩色图像/{}.jpg'.format(k))
def dodge(a, b, alpha):
return min(int(a*255/(256-b*alpha)), 255) #将灰度图像与滤波后的反色图像混合
def draw(img, blur=25, alpha=1.0):
img1 = img.convert('L') #图片转换成灰色
img2 = img1.copy()
img2 = ImageOps.invert(img2) #将输入图像转换为反色图像
for i in range(blur): #模糊度
img2 = img2.filter(ImageFilter.BLUR) #调用滤波函数对图像进行滤波
width, height = img1.size
for x in range(width):
for y in range(height):
#getpixel:用来获取图像中某一点的像素的RGB颜色值
a = img1.getpixel((x, y))
b = img2.getpixel((x, y))
#putpixel:给图像中某一点加RGB颜色值,alpha:透明度
img1.putpixel((x, y), dodge(a, b, alpha))
#img1.show()
#img1.save('12.jpg')
img1.save('{}.jpg'.format(k))
draw(img)
四. 个人总结
4.1 个人体会
由于本实习内容主要有爬取彩色图像、将彩色图像转化为素描图像两个方面,所以我主要从这两方面来谈谈实习体会。
首先,由于是在动态网页上爬取彩色图像,所以默认只能爬取174张图片,要想获取全部图像,则需要对 url 以及正则表达式进行修改,但由于将彩色图像
变为素描图象时,如果图像数量越多,耗费时间、空间越多,本实习题目只是用
于演示,无需爬取全部图片。其次,利用动态网页爬取数据与图像有所不同,爬
取数据需要找到真实的 url,但爬取图片则首先需要找到全部图片的网页的 url,
再通过返回的 content 找到每个图片的 url,一般利用正则表达式提取字典中的
键值即可得到,之后利用 for 循环对每一个图片的 url 发送请求、解码、保存即
可。其次,将彩色图像转化为素描图像时,遇到的一个难点是如何批量读取与保
存图像到指定文件夹下,通过在网上查找相关资料与视频,需要用到 for 循环与
format 占位符,问题得到了解决。
4.2 个人心得
遇到问题需要自己独立的查找相关资料并解决,在这个过程中,可能会遇到新的问题,所以又需要解决新问题,在解决新问题时,可能还会遇到新问题,再
接着去解决,如此循环往复,虽然最终仅仅完成了一个题目,但在这个过程
中确实可以收获许多意想不到的新知识。比如,在解析别人写的彩图变素描的代
码时,要清楚每一行代码、每一个库、每一个函数的作用,并加以注释,这样就
又多掌握了一个库的使用、一个函数的调用与作用,而且还回顾并加深了一些数
字图像的基础知识,理论和实际相结合,能够将知识掌握的更加牢固。
4.3 个人反思
本题目主要是关于图像处理方面的,在解析别人所写的彩图变素描的代
码时,觉得自己遗忘了许多图像处理的基础知识,比如二值图像、灰度图像、彩
色图像的概念,尤其容易混淆二值图像和灰度图像的概念;还有滤波的作用,以
及几种常见滤波(如:均值滤波、方框滤波等)的原理、区别、优缺点等。所以
对学过的知识要时常回顾,温故而知新。
好啦,本期就分享到这里!