基于特征的图像对齐(SIFT或ORB)

您所在的位置:网站首页 OpenCV图像对齐方式有哪几种 基于特征的图像对齐(SIFT或ORB)

基于特征的图像对齐(SIFT或ORB)

#基于特征的图像对齐(SIFT或ORB)| 来源: 网络整理| 查看: 265

一. 效果图

什么是图像对齐或者图像配准? 图像对齐(或者图像配准)可以扭曲旋转(其实是仿射变换)一张图使它和另一个图可以很完美的对齐。 下图为SIFT特征匹配的图。 在这里插入图片描述 下图为上面左边图矫正的结果。 在这里插入图片描述

二. 基于特征的图像对齐步骤

下面以ORB特征为例说明,SIFT特征的步骤与ORB几乎相同。

1. 读取图片到内存 2. 检测特征点

为两张图检测ORB特征点。为了计算单应性矩阵4个就够了,但是一般会检测到成百上千的特征点。可以使用参数MAX_FEATURES 来控制检测的特征点的数量。检测特征点并计算描述子的函数是detectAndCompute。

3. 特征匹配

找到两图中匹配的特征点,并按照匹配度排列,保留最匹配的一小部分。然后把匹配的特征点画出来并保存图片到磁盘。我们使用汉明距离来度量两个特征点描述子的相似度。下图中把匹配的特征点用线连起来了。注意,有很多错误匹配的特征点,所以下一步要用一个健壮的算法来计算单应性矩阵。

4. 计算单应性矩阵

上一步产生的匹配的特征点不是100%正确的,就算只有20~30%的匹配是正确的也不罕见。findHomography 函数使用一种被称为随机抽样一致算法(Random Sample Consensus )的技术在大量匹配错误的情况下计算单应性矩阵。

5. 扭转图片(Warping image)

有了精确的单应性矩阵,就可以把一张图片的所有像素映射到另一个图片。warpPerspective 函数用来完成这个功能。

三. 代码实现 from __future__ import print_function import cv2 import numpy as np MAX_FEATURES = 500 GOOD_MATCH_PERCENT = 0.15 def alignImages(im1, im2): # Convert images to grayscale im1Gray = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY) im2Gray = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY) # Detect ORB features and compute descriptors. orb = cv2.ORB_create(MAX_FEATURES) keypoints1, descriptors1 = orb.detectAndCompute(im1Gray, None) keypoints2, descriptors2 = orb.detectAndCompute(im2Gray, None) # Match features. matcher = cv2.DescriptorMatcher_create(cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING) matches = matcher.match(descriptors1, descriptors2, None) # Sort matches by score matches.sort(key=lambda x: x.distance, reverse=False) # Remove not so good matches numGoodMatches = int(len(matches) * GOOD_MATCH_PERCENT) matches = matches[:numGoodMatches] # Draw top matches imMatches = cv2.drawMatches(im1, keypoints1, im2, keypoints2, matches, None) cv2.imwrite("matches.jpg", imMatches) # Extract location of good matches points1 = np.zeros((len(matches), 2), dtype=np.float32) points2 = np.zeros((len(matches), 2), dtype=np.float32) for i, match in enumerate(matches): points1[i, :] = keypoints1[match.queryIdx].pt points2[i, :] = keypoints2[match.trainIdx].pt # Find homography h, mask = cv2.findHomography(points1, points2, cv2.RANSAC) # Use homography height, width, channels = im2.shape im1Reg = cv2.warpPerspective(im1, h, (width, height)) return im1Reg, h if __name__ == '__main__': # Read reference image refFilename = "img1.png" print("Reading reference image : ", refFilename) imReference = cv2.imread(refFilename, cv2.IMREAD_COLOR) # Read image to be aligned imFilename = "img2.png" print("Reading image to align : ", imFilename); im = cv2.imread(imFilename, cv2.IMREAD_COLOR) print("Aligning images ...") # Registered image will be resotred in imReg. # The estimated homography will be stored in h. imReg, h = alignImages(im, imReference) # Write aligned image to disk. outFilename = "aligned.jpg" print("Saving aligned image : ", outFilename); cv2.imwrite(outFilename, imReg) # Print estimated homography print("Estimated homography : \n", h)

每天进步一点,加油!!! 欢迎技术交流,如果想用SIFT特征实现,请联系作者。 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3