咱们须要识别出敏感做者的avatar头像,把”皮卡丘“换成”优雅的python“。python
敏感图片样本属性:git
爬虫获取的图片属性:github
替换成:算法
检查两个图片的类似度,一个简单而快速的算法:感知哈希算法(Perceptual Hash),经过某种提取特征的方式为每一个图片计算一个指纹(哈希),这样对比两个图片类似与否就变成了对比两个指纹异同的问题。url
Step1.缩小尺寸
将图片缩小到8*8的大小,这样作能够去除图片的细节,只保留结构和明暗等基本信息,同时摒弃不一样尺寸和比例带来的图片差别。spa
Step2.灰度处理
把缩小后的图片转化为64级灰度图(每一个像素只有64种颜色)。3d
Step3.计算平均值
计算全部64个像素的灰度平均值。code
Step4.计算哈希
这里哈希的计算方法是:上面说的64个像素的灰度与平均值进行比较,大于或等于平均值记为1,小于记为0。orm
将每一个像素的比较结果组合在一块儿成为一个64位的二进制整数,这个整数就是此图片的指纹。blog
Step5.对比哈希
不一样图片对比的方法,就是对比它们的64位哈希中,有多少位不同(汉明距离)。通常来讲若是不一样的位数不超过5,就说明两张图片很类似,若是大于10,就极可能是两张不一样的图片。
先来安装pillow、requests:
pip3 install pillow requests
导入包:
from functools import reduce from PIL import Image import requests
实现图片类似度算法:
# 计算pHash(只须要三行): def phash(img): img = img.resize((8, 8), Image.ANTIALIAS).convert('L') avg = reduce(lambda x, y: x + y, img.getdata()) / 64. return reduce( lambda x, y: x | (y[1] << y[0]), enumerate(map(lambda i: 0 if i < avg else 1, img.getdata())), 0 ) # 计算汉明距离: def hamming_distance(a, b): return bin(a^b).count('1') # 计算两个图片是否类似: def is_imgs_similar(img1,img2): return True if hamming_distance(phash(img1),phash(img2)) <= 5 else False
结合爬虫:
# 打开本地存放一张敏感图片; # 本次为了方便演示,重新浪图床拉下一张1024X1024的图片,保存命名为sensitive.jpg sensitive_url="https://ws4.sinaimg.cn/large/006tNbRwgy1fwttj7bi36j30sg0sgwm0.jpg" headers = { "User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5"} pic = requests.get(sensitive_url, headers=headers, timeout=300) if pic.status_code == 200: with open("sensitive.jpg", 'wb') as f: f.write(pic.content) sensitive_pic = Image.open("sensitive.jpg") # 爬虫获取的图片 target_url="https://ws3.sinaimg.cn/large/006tNbRwgy1fwttsauo6jj30h80han0y.jpg" pic = requests.get(target_url, headers=headers, timeout=300) if pic.status_code == 200: with open("target.jpg", 'wb') as f: f.write(pic.content) target_pic = Image.open("target.jpg") # 判断爬虫获取的图片和敏感图片是否类似 if is_imgs_similar(target_pic, sensitive_pic): print("2张图片类似,替换敏感图片为”优雅的python“:{}".format("https://ws2.sinaimg.cn/large/006tNbRwgy1fw9yjmot3uj30y60y6q40.jpg")) else: print("不类似")
运行结果:
https://gist.github.com/luzih...