咱們須要識別出敏感做者的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...