什么是计算机视觉?
计算机视觉是人工智能的一个领域,它训练计算机解释和理解视觉世界。使用来自相机和视频的数字图像以及深度学习模型,机器可以准确地识别和分类物体——然后对它们“看到”的东西做出反应。
计算机视觉任务包括获取、处理、分析和理解数字图像的方法
计算机视觉主要专注于处理原始输入图像,以增强其准备完成其他任务。计算机视觉专注于从输入图像或视频中提取信息,以正确理解它们,从而像人脑一样预测视觉输入。
目的
该项目的目的是使用计算机视觉检测 PAN 篡改/欺诈卡。该项目将帮助不同的组织检测员工或客户或任何人提供给他们的信息 Id,即 PAN 卡是原件吗?
我们将计算这个项目 PAN 用户上传的卡原件 PAN 这是这个项目的灵魂,我们将在这个博客后面进行深入的讨论。
同样,在这个项目中,借助涉及计算机视觉技术的图像处理,我们将检测 PAN 卡的给定图像是原件还是篡改(假)PAN 卡。
本项目涉及的步骤如下
导入必要的库
从网站上爬行被篡改的网站pan卡原件
将篡改图像的形状缩小到原始图像
读取和篡改原始图像
将图像转化为灰度图像
结构相似性指数应用于两个图像之间(SSIM)技术
计算阈值和轮廓
实时体验图像的轮廓和阈值
导入必要的包
fromskimage.metricsimportstructural_similarity importimutils importcv2 fromPILimportImage importrequests
Scikit-image,或ski-mage,是开源的Python 在这个项目中,大多数图像处理技术将通过scikit-image 来使用
Imutils 使用一系列方便的函数OpenCV 中的平移、旋转、调整大小和显示图像等基本图像处理功能变得更容易。
OpenCV (开源计算机视觉库)是编程函数库。在这个项目中,图像的读写是通过 cv2 完成的。
PIL (Python 图像库)是 Python 免费开源附加库的编程语言增加了对许多不同图像文件格式的开放、操作和保存的支持。
!mkdirpan_card_tampering !mkdirpan_card_tampering/image
从不同的来源爬行PAN 卡原件和篡改 PAN 卡
original=Image.open(requests.get('https://www.thestatesman.com/wp-content/uploads/2019/07/pan-card.jpg',stream=True).raw) tampered=Image.open(requests.get('https://assets1.cleartax-cdn.com/s/img/20170526124335/Pan4.png',stream=True).raw)
我们使用上述代码片段requests网络捕获来自不同来源的图像。
加载用户提供的原始图像和图像
#Thefileformatofthesourcefile. print("Originalimageformat:",original.format) print("Tamperedimageformat:",tampered.format) #Imagesize,inpixels.Thesizeisgivenasa2-tuple(width,height). print("Originalimagesize:",original.size) print("Tamperedimagesize:",tampered.size)
输出 :
Originalimageformat:JPEG Tamperedimageformat:PNG Originalimagesize:(1200,800) Tamperedimagesize:(282,179)
正如你在上面的输出中看到的,原始图像的原始大小不同于篡改图像的原始大小,这将导致不必要的错误结果,这就是为什么图像被缩小到相同的形状。
将篡改图像的格式转换为类似原始图像的格式。
#ResizeImage original=original.resize((250,160)) print(original.size) original.save('pan_card_tampering/image/original.png')#Saveimage tampered=tampered.resize((250,160)) print(tampered.size) tampered.save('pan_card_tampering/image/tampered.png')#Savesimage
输出 :
(250,160) (250,160)
现在,如果您将输出图像(原始图像和篡改图像)的形状缩小到相同的形状,即(250和160)。当前的图像处理将比以前更加光滑和准确。
如有必要,我们可以更改图像格式(png 或 jpg)。
#Changeimagetypeifrequiredfrompngtojpg tampered=Image.open('pan_card_tampering/image/tampered.png') tampered.save('pan_card_tampering/image/tampered.png')#candopngtojpg
原始显示将用于比较 PAN 卡图像。
#Displayoriginalimage original
输出 :
将显示用户提供的图像 PAN 比较卡。
#Displayusergivenimage tampered
输出 :
使用 OpenCV 读取图像。
#loadthetwoinputimages original=cv2.imread('pan_card_tampering/image/original.png') tampered=cv2.imred('pan_card_tampering/image/tampered.png')
现在在上面的代码中,我们使用 cv2 的**imread()**函数读取图像(原件和篡改)。
将图像转换为灰度
# Convert the images to grayscale
original_gray = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)
tampered_gray = cv2.cvtColor(tampered, cv2.COLOR_BGR2GRAY)
在上面的代码中,我们使用参数为函数将原始图像(原始PAN卡和用户给定的PAN卡)转换为灰度图像。
但是为什么我们需要将它们转换为灰度?原因如下:
将图像转换为灰度对于图像处理的不准确性非常有益,因为在图像处理中,许多应用程序并不能帮助我们识别重要性,彩色图像的边缘以及彩色图像对于机器理解有点复杂,因为它们有3 个通道,而灰度只有1 个通道。
在两幅图像之间应用结构相似性指数 (SSIM) 技术
首先我们需要了解什么是SSIM。
**结构相似性指数 (SSIM)**是一种感知度量,用于量化由数据压缩等处理或数据传输丢失引起的图像质量下降。
这个指标基本上是一个完整的参考,需要来自同一个镜头的2 个图像,这意味着对于人眼来说,2 个图像是相同的。第二张图片一般是经过压缩的或者有不同的质量,这就是这个指标的目标。
SSIM 通常用于视频行业,但在方面也有很强的应用。
SSIM 实际上衡量的是两个相似图像之间的感知差异。它无法判断两者中的哪一个更好:必须从知道哪个是原始的以及哪个已经暴露于诸如压缩或过滤器之类的附加处理来推断。
# Compute the Structural Similarity Index (SSIM) between the two images,
# ensuring that the difference image is returned
(score, diff) = structural_similarity(original_gray, tampered_gray, full=True)
diff = (diff * 255).astype("uint8")
print("SSIM Score is : {}".format(score*100))
if score >= 80:
print ("The given pan card is original")
else:
print("The given pan card is tampered")
输出 :
SSIM Score is : 31.678790332739425
The given pan card is tampered
让我们分解一下上面代码中刚刚发生的事情
结构相似性指数帮助我们准确地确定在x,y 坐标位置方面,图像差异在哪里。在这里,我们试图找到原始图像和篡改图像之间的相似之处。
SSIM分数越低相似度越低,即SSIM分数与两幅图像的相似度
我们给出了一个阈值“45”,即如果分数>= 80,它将被视为原卡,否则被篡改。
通常,对于良好质量的重建技术,SSIM 值为 0.97、0.98、0.99。
体验图像上的实时阈值和轮廓
轮廓检测是一个过程,可以简单地解释为连接所有连续点(连同边界)的曲线,具有相同的颜色或强度。该算法确实找到了图像的边缘,但也将它们置于层次结构中。
# Calculating threshold and contours
thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
在这里,我们使用计算机视觉的阈值函数,该函数将自适应阈值应用于存储在表单数组中的图像。
查找轮廓适用于二值图像并检索轮廓。。抓取轮廓,抓取合适的轮廓值。
创建边界框(轮廓)
# loop over the contours
for c in cnts:
# applying contours on image
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(original, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.rectangle(tampered, (x, y), (x + w, y + h), (0, 0, 255), 2)
边界矩形帮助找到对象的边界矩形的宽高比。我们计算轮廓的边界框,然后在两个输入图像上绘制边界框以表示两个图像的不同之处**。**
#Display original image with contour
print('Original Format Image')
original_contour = Image.fromarray(original)
original_contour.save("pan_card_tampering/image/original_contour_image.png")
original_contour
输出 :
Original format Image
在上面的输出中,你可以看到使用**fromarray()**函数显示原始图像及其轮廓(边界框)。
此外,你可以使用**save()**函数(可选)简单地保存图像。
#Diplay tampered image with contour
print('Tampered Image')
tampered_contour = Image.fromarray(tampered)
tampered_contour.save("pan_card_tampering/image/tampered_contours_image.png")
tampered_contour
输出 :
Tampered Image
推断:这与篡改图像类似,但可以注意到篡改图像中缺少某些轮廓。
这是上述结果的说明
# Display difference image with black
print('Different Image')
difference_image = Image.fromarray(diff)
difference_image.save("pan_card_tampering/image/difference_image.png")
difference_image
输出 :
Different Image
这是根据加热阈值显示轮廓的另一种交互式的方式,即通过查找(文本/图像区域)和(没有文本/图像)。
加热区,即具有文本/图像的区域将显示在深色区域中,而另一种区域显示为浅色区域。
#Display threshold image with white
print('Threshold Image')
threshold_image = Image.fromarray(thresh)
threshold_image.save("pan_card_tampering/image/threshold_image.png")
threshold_image
输出 :
Threshold Image
推论:这里的一切都是一样的,我们只能看到颜色作用的变化,这里白色表示加热区,黑色表示正常区。
总结
找出有助于我们找到图像形状的差异或相似性。
同样,根据该阈值为转换为灰度二值的图像找出和也有助于我们进行形状分析和识别。
由于我们的 SSIM 约为 31.2%,我们可以说用户提供的图像是伪造的或被篡改的。
最后,我们通过显示具有轮廓、差异和阈值的图像来。
范围
该项目可用于不同的组织,客户或用户需要提供任何类型的 id 才能进行验证。该组织可以使用该项目来查明该 ID 是原始的还是伪造的。同样,这可用于任何类型的ID,如 Aadhar、选民 ID 等。
尾注
这里提供代码链接,以便你们也可以学习并为这个项目做出贡献,使其变得更好:https://github.com/Aman-Preet-Singh-Gulati/Pan-card-tempering-detection
如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。