使用sift特征对图片进行矫正

在对有模板的图片进行ocr之前,比如发票,可以使用sift找到图片的特征,与模板图片关键点进行匹配矫正,可以处理旋转90°180°270°图片。

1. 使用sift找到关键点

SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。sift专利2020年3月刚过期,现在可以免费使用了。

img = cv2.imread('data/00.jpg')
gray= cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(img,None)
img = cv2.drawKeypoints(img,keypoints_1,img)

图上彩色的小圆圈就是关键特征点。

模板图片特征点

2. 两张图的关键点进行匹配

FlannBasedMatcher ( 快速最近邻逼近搜索函数库(Fast Approximate Nearest Neighbor Search Library) )速度快,也可以使用暴力的BFMatcher,速度较慢。

# FLANN 参数设计
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params,search_params)

matches = flann.knnMatch(des1,des2,k=2)
matchesMask = [[0,0] for i in range(len(matches))]

# 挑选出匹配较好的一些点
good = []
for m,n in matches:
    if m.distance < 0.75 * n.distance:
        good.append([m])

img5 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
拍摄图片与模板图片匹配上的特征点

3. 使用关键点矫正

findHomography: 计算多个二维点对之间的最优单映射变换矩阵 H(3行x3列) ,使用最小均方误差或者RANSAC方法

kp_matched_kpts = np.float32([kp1[m[0].queryIdx].pt for m in good]).reshape(-1,1,2)
sensed_matched_kpts = np.float32([kp2[m[0].trainIdx].pt for m in good]).reshape(-1,1,2)

#使用两张图对应上的关键点,得到变换矩阵
H, status = cv2.findHomography(sensed_matched_kpts, kp_matched_kpts, cv2.RANSAC,5.0)
warped_image = cv2.warpPerspective(img2, H, (img1.shape[1], img1.shape[0])) 
矫正之后的图片

之后再做ocr任务就会简单很多了。还能找出特定要抽的信息区域。


原始图片

参考:
https://blog.csdn.net/zhangziju/article/details/79754652
https://www.jiqizhixin.com/articles/2019-08-06-9

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容