python識別圖片是否被ps修改過

我們經常線上透過網頁提交身份材料辦理業務的時候,發現ps修改過的圖片在辦理業務的時候提示非真實拍照要求重新上傳,那麼這個是怎麼實現的,今天教大家用python來實現一個識別圖片真假的程式。

python識別圖片是否被ps修改過

我們先說說鑑別的原理

▊ 主要分兩級鑑別:

▶第一級、透過檢查圖片檔案中的metadata獲取圖片被修改的簽名信息,如被Photoshop修改的話會有相關的簽名字樣,但是這個不能完全杜絕透過其他途徑修改圖片資訊,那麼我們就進行第二級別的驗證。

▶第二級、對影象進行ELA(錯誤級別分析)檢測,然後將檢測結果提供給LBPH(本地二進位制模式直方圖) 識別器,該識別器確定其是偽影象還是真實影象。雖然LBPH演算法用於人臉識別,但是它也可以在該專案中用於生成直方圖並進行比較。

好了,我們來看看程式碼怎麼寫吧。

▊ 所需要使用的python庫

Python 2。7。14OpenCV2TkinterPillowNumpy

▊ 第一級檢測程式碼

f=1img = PIL。Image。open(imgName)info = img。_getexif()if info: for (tag, value) in info。items(): if “Software” == TAGS。get(tag, tag): lab[‘text’] = lab[‘text’] + “\非拍照圖” lab[‘text’] = lab[‘text’] + “\n找到修改軟體的簽名 : ” + value f=0if f: lab[‘text’] = lab[‘text’] + “\n沒找到修改軟體簽名” lab[‘text’] = lab[‘text’] + “\n看似是真實圖片,進入第二級檢測”

▋ 第二級檢測程式碼

window。title(“Level 2 Testing”) lab[‘text’] = “Doing ELA analysis 。。。 Please wait for a minute” window。update_idletasks() TEMP = ‘temp。jpg’ SCALE = 10 original = PIL。Image。open(imgName) original。save(TEMP, quality=90) temporary = PIL。Image。open(TEMP) diff = ImageChops。difference(original, temporary) d = diff。load() WIDTH, HEIGHT = diff。size for x in range(WIDTH): for y in range(HEIGHT): d[x, y] = tuple(k * SCALE for k in d[x, y]) diff。save(“img。jpg”) lab[‘text’] = lab[‘text’] + “\nDoing Histogram Analysis 。。。” window。update_idletasks() rec = cv2。createLBPHFaceRecognizer() rec。load(“TrainedDataFolder/TraningData。yml”) imggray = PIL。Image。open(“img。jpg”)。convert(‘L’) gray = np。array(imggray,‘uint8’) lab[‘text’] = lab[‘text’] + “\nResult : ” id,conf = rec。predict(gray) if(id == 2): lab[‘text’] = lab[‘text’] + “\nREAL ” lab[‘text’] = lab[‘text’] + str(100 - conf) else: lab[‘text’] = lab[‘text’] + “\nFAKE ” lab[‘text’] = lab[‘text’] + str(100 - conf) b1。pack_forget()

▋ 好了,我來看看程式碼執行的效果

python識別圖片是否被ps修改過

python識別圖片是否被ps修改過

好了,如果想要程式碼的話,請關注我,私信傳送“假圖片”就可獲得原始碼下載地址。