Python彩图变素描

本次分享本科阶段用Python爬取彩色图像的一个案例--彩色图像变素描,主要有以下两个目的
(1)批量爬取彩色图像,并将其保存在某一文件夹下。
(2)读取保存在文件夹下的彩色图像,利用 python 编程将其变为素描图像,并保存。

一. 爬取彩色图像

爬取彩色图像 并保存在给定的文件夹中, 如图所示:
某一张彩色图片如图所示:

二. 转化素描图像

(1) 首先,利用 PIL 库中的 Image 读取图像,图像类型为 Image,模式(Mode)为 RGB, 如图所示:

(2) 其次, 将 RGB 图转化为灰度图,灰度图如图所示:

(3) 接着,将灰度图进行反色操作,即 255-当前像素点,反色图像如图所示:
(4) 对步骤 (3)(即反色图像)中的图片进行高斯模糊 Gaussian blur,即能够很有
效地减少图像中的噪声,将图像变得更加平滑一点。高斯模糊图像如图所示:
(5) 将步骤(2)中的灰度图像和步骤(4)中的模糊反色图像混合并批量保存,如图所示:
某一张素描图像如图所示:

三. 完整代码

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 个人反思

本题目主要是关于图像处理方面的,在解析别人所写的彩图变素描的代 码时,觉得自己遗忘了许多图像处理的基础知识,比如二值图像、灰度图像、彩 色图像的概念,尤其容易混淆二值图像和灰度图像的概念;还有滤波的作用,以 及几种常见滤波(如:均值滤波、方框滤波等)的原理、区别、优缺点等。所以 对学过的知识要时常回顾,温故而知新。
好啦,本期就分享到这里!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值