复印身份证所引发的一系列问题与思考

0.背景

最近,准备一些材料的时候,需要用到身份证的正反面复印件。将一张卡的正反面复印到一面纸上,从来都是挺抓狂的事情。因为记不住复印完一面后,纸张是以什么样的位置放进打印机,而另一面又该怎么摆放。所以,总是喊同事帮我复印,然而,她很简单粗暴地在一张纸的正反面,分别复印身份证的正反面。不过,同事给我提供了一个方便日后复印的方法,她建议我把身份证扫描一份,电子扫描件存在电脑里,这样以后就可以直接打印了。

我很愉快地听从她的建议,扫描我的身份证去了。然而,又一个问题出现了,扫描完成后,保存的是一个pdf文件,里面有两页,分别是我第一次扫描的身份证正面和第二次扫描的反面。如下图所示:

这个时候,我的问题从“复印身份证正反面的技巧”变成了“如何将两页pdf合并为一页”。为此,我去下载了一个pdf编辑器,它提供了能够在页面上插入图片的功能。我试图将身份证反面的截图插入到第一页的右侧,操作成功了。但我打印出来一看,由于反面我是以截图的形式插入的,显得特别模糊。这个尝试以失败告终。

我又转念想,那么就不勉强将正反面合成一页pdf了,在打印的时候通过“布局”,一张纸上打印两页的内容不就好了。结果打印出来一看,图片被缩小了,不是1:1的比例了。

 

1.opencv操作图片

由于我最近一直在使用opencv处理图片,我突然想到,完全可以用opencv来实现我当前的需求。我可以将这个pdf另存为两张图片,然后通过截取图2的右上区域,填到图1的右上区域。这是opencv里非常基本的操作,却一下子解决了一个令我头疼的问题。我是用的是opencv-python,代码如下:

import cv2


from_folder = '/Users/rinka/Desktop/'
front_img = cv2.imread(from_folder+'id-card-front.png')
back_img = cv2.imread(from_folder+'id-card-back.png')
h, w, c = front_img.shape

roi_back_img = back_img[0:h//2:, w//2:, :]
front_img[0:h//2:, w//2:, :] = roi_back_img
cv2.imwrite(from_folder+'id-card-all-in-one.png', front_img)

 

 

2.图片的基本概念

我们日常看到的彩色图片,转换到numpy里,就是一个三维数组。第一维和第二维通过行、列索引来操作图片上的像素点,第三维是通道,常见的为RGB三通道。我们通过行、列索引的切片操作来截取图片中的某块区域,这块区域被形象地成为ROI(region of interest),翻译过来就是“感兴趣的区域”。

上面的场景中,我感兴趣的区域就是图2的右上区域,也就是印着我身份证反面的区域。对于行索引的切片范围,即0~图片高度的一半;对于列索引的切片范围,即图片宽度的一半~图片宽度。而对于图1,我要修改的区域也是页面的右上区域。于是,修改图1的这部分区域的像素值为图2的ROI。

 

 

3.感悟

学习技术,最终目的还是为了改变生活,让生活变得更加便利,将人从重复性工作中解救出来,去做更有创造力的事情。人们通过各种技术的排列组合,创造了各种各样的工具。但当有时候,现成工具无法满足当前的需求,应该从寻找工具里抽离出来,从更底层去考虑怎么通过自己已知的技术,去解决这个问题。工具虽然便利,但不要被工具所困。

posted @ 2018-03-13 22:24  rinka  阅读(1139)  评论(2编辑  收藏  举报