我们经常在线通过网页提交身份材料办理业务的时候,发现ps修改过的图片在办理业务的时候提示非真实拍照要求重新上传,那么这个是怎么实现的,今天教大家用python来实现一个识别图片真假的程序。
我们先说说鉴别的原理
▊ 主要分两级鉴别:
?第一级、通过检查图片文件中的metadata获取图片被修改的签名信息,如被Photoshop修改的话会有相关的签名字样,但是这个不能完全杜绝通过其他途径修改图片信息,那么我们就进行第二级别的验证。
?第二级、对图像进行ELA(错误级别分析)检测,然后将检测结果提供给LBPH(本地二进制模式直方图) 识别器,该识别器确定其是伪图像还是真实图像。虽然LBPH算法用于人脸识别,但是它也可以在该项目中用于生成直方图并进行比较。
好了,我们来看看代码怎么写吧。
▊ 所需要使用的python库
Python
OpenCV2
Tkinter
Pillow
Numpy
▊ 第一级检测代码
f=1
img = 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=0
if 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 =
original = PIL.Image.open(imgName)
original.save(TEMP, quality=)
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 - conf)
else:
lab['text'] = lab['text'] + "\nFAKE "
lab['text'] = lab['text'] + str - conf)
b1.pack_forget()
▋ 好了,我来看看代码运行的效果
好了,如果想要代码的话,请关注我,私信发送"假图片"就可获得源码下载地址。