我们经常在线通过网页提交身份材料办理业务的时候,发现ps修改过的图片在办理业务的时候提示非真实拍照要求重新上传,那么这个是怎么实现的,今天教大家用python来实现一个识别图片真假的程序。
我们先说说鉴别的原理
▊ 主要分两级鉴别:
▶第一级、通过检查图片文件中的metadata获取图片被修改的签名信息,如被Photoshop修改的话会有相关的签名字样,但是这个不能完全杜绝通过其他途径修改图片信息,那么我们就进行第二级别的验证。
▶第二级、对图像进行ELA(错误级别分析)检测,然后将检测结果提供给LBPH(本地二进制模式直方图) 识别器,该识别器确定其是伪图像还是真实图像。虽然LBPH算法用于人脸识别,但是它也可以在该项目中用于生成直方图并进行比较。
好了,我们来看看代码怎么写吧。
▊ 所需要使用的python库
Python 2.7.14
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 = 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()
网友评论1