百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

OpenCV图像配准:Affine-SIFT(opencv图像resize)

toyiye 2024-07-02 02:55 11 浏览 0 评论


一个图像要与另外一个图像配准

我们先对两个图像提取各自的sift特征点集合,然后再将分布于图像上的特征点一一配对。

这里假设相互配对特征点,其位置从一个集合,变换到新的集合时,是符合刚体变换的。

这个刚体变换就可以用于求取一一配对的匹配点的过程中。


asift.py

'''

Affine invariant feature-based image matching sample.

图像配准例子代码--基于仿射不变特征

这个代码与find_obj.py类似,但是用了仿射变换空间采样技术,命名为ASIFT。这里提取特征仍然用的是原来的提取特征方法SIFT,所以这里可以用SURF,或者ORB来替代。

Homograph RANSAC用来剔除异常点。

多线程用来快速地进行仿射采样。

[1] http://www.ipol.im/pub/algo/my_affine_sift/


USAGE

asift.py [--feature=<sift|surf|orb|brisk>[-flann]] [ <image1> <image2> ]


--feature - 选择提取feature的方法 . 可以是 sift, surf, orb or brisk. '-flann'

特指用 Flann-based 匹配器而不使用bruteforce.


在特征点上点击鼠标左键,可以查看它对应的匹配点。

imag1,和image2是需要配准的两张图片

'''

使用ASIFT方法图像配准

打开链接http://www.ipol.im/pub/algo/my_affine_sift

源代码:

1 #!/usr/bin/env python

2

3 '''

4 Affine invariant feature-based image matching sample.

5

6 This sample is similar to find_obj.py, but uses the affine transformation

7 space sampling technique, called ASIFT [1]. While the original implementation

8 is based on SIFT, you can try to use SURF or ORB detectors instead. Homography RANSAC

9 is used to reject outliers. Threading is used for faster affine sampling.

10

11 [1] http://www.ipol.im/pub/algo/my_affine_sift/

12

13 USAGE

14 asift.py [--feature=<sift|surf|orb|brisk>[-flann]] [ <image1> <image2> ]

15

16 --feature - Feature to use. Can be sift, surf, orb or brisk. Append '-flann'

17 to feature name to use Flann-based matcher instead bruteforce.

18

19 Press left mouse button on a feature point to see its matching point.

20 '''

21

22 # Python 2/3 compatibility

23 from __future__ import print_function

24

25 import numpy as np

26 import cv2 as cv

27

28 # built-in modules

29 import itertools as it

30 from multiprocessing.pool import ThreadPool

31

32 # local modules

33 from common import Timer

34 from find_obj import init_feature, filter_matches, explore_match

35

36

37 def affine_skew(tilt, phi, img, mask=None):

38 '''

39 affine_skew(tilt, phi, img, mask=None) -> skew_img, skew_mask, Ai

40

41 Ai - is an affine transform matrix from skew_img to img

42 '''

43 h, w = img.shape[:2]

44 if mask is None:

45 mask = np.zeros((h, w), np.uint8)

46 mask[:] = 255

47 A = np.float32([[1, 0, 0], [0, 1, 0]])

48 if phi != 0.0:

49 phi = np.deg2rad(phi)

50 s, c = np.sin(phi), np.cos(phi)

51 A = np.float32([[c,-s], [ s, c]])

52 corners = [[0, 0], [w, 0], [w, h], [0, h]]

53 tcorners = np.int32( np.dot(corners, A.T) )

54 x, y, w, h = cv.boundingRect(tcorners.reshape(1,-1,2))

55 A = np.hstack([A, [[-x], [-y]]])

56 img = cv.warpAffine(img, A, (w, h), flags=cv.INTER_LINEAR, borderMode=cv.BORDER_REPLICATE)

57 if tilt != 1.0:

58 s = 0.8*np.sqrt(tilt*tilt-1)

59 img = cv.GaussianBlur(img, (0, 0), sigmaX=s, sigmaY=0.01)

60 img = cv.resize(img, (0, 0), fx=1.0/tilt, fy=1.0, interpolation=cv.INTER_NEAREST)

61 A[0] /= tilt

62 if phi != 0.0 or tilt != 1.0:

63 h, w = img.shape[:2]

64 mask = cv.warpAffine(mask, A, (w, h), flags=cv.INTER_NEAREST)

65 Ai = cv.invertAffineTransform(A)

66 return img, mask, Ai

67

68

69 def affine_detect(detector, img, mask=None, pool=None):

70 '''

71 affine_detect(detector, img, mask=None, pool=None) -> keypoints, descrs

72

73 Apply a set of affine transformations to the image, detect keypoints and

74 reproject them into initial image coordinates.

75 See http://www.ipol.im/pub/algo/my_affine_sift/ for the details.

76

77 ThreadPool object may be passed to speedup the computation.

78 '''

79 params = [(1.0, 0.0)]

80 for t in 2**(0.5*np.arange(1,6)):

81 for phi in np.arange(0, 180, 72.0 / t):

82 params.append((t, phi))

83

84 def f(p):

85 t, phi = p

86 timg, tmask, Ai = affine_skew(t, phi, img)

87 keypoints, descrs = detector.detectAndCompute(timg, tmask)

88 for kp in keypoints:

89 x, y = kp.pt

90 kp.pt = tuple( np.dot(Ai, (x, y, 1)) )

91 if descrs is None:

92 descrs = []

93 return keypoints, descrs


94

95 keypoints, descrs = [], []

96 if pool is None:

97 ires = it.imap(f, params)

98 else:

99 ires = pool.imap(f, params)

100

101 for i, (k, d) in enumerate(ires):

102 print('affine sampling: %d / %d\r' % (i+1, len(params)), end='')

103 keypoints.extend(k)

104 descrs.extend(d)

105

106 print()

107 return keypoints, np.array(descrs)

108

109

110 def main():

111 import sys, getopt

112 opts, args = getopt.getopt(sys.argv[1:], '', ['feature='])

113 opts = dict(opts)

114 feature_name = opts.get('--feature', 'brisk-flann')

115 try:

116 fn1, fn2 = args

117 except:

118 fn1 = 'aero1.jpg'

119 fn2 = 'aero3.jpg'

120

121 img1 = cv.imread(cv.samples.findFile(fn1), cv.IMREAD_GRAYSCALE)

122 img2 = cv.imread(cv.samples.findFile(fn2), cv.IMREAD_GRAYSCALE)

123 detector, matcher = init_feature(feature_name)

124

125 if img1 is None:

126 print('Failed to load fn1:', fn1)

127 sys.exit(1)

128

129 if img2 is None:

130 print('Failed to load fn2:', fn2)

131 sys.exit(1)

132

133 if detector is None:

134 print('unknown feature:', feature_name)

135 sys.exit(1)

136

137 print('using', feature_name)

138

139 pool=ThreadPool(processes = cv.getNumberOfCPUs())

140 kp1, desc1 = affine_detect(detector, img1, pool=pool)

141 kp2, desc2 = affine_detect(detector, img2, pool=pool)

142 print('img1 - %d features, img2 - %d features' % (len(kp1), len(kp2)))

143

144 def match_and_draw(win):

145 with Timer('matching'):

146 raw_matches = matcher.knnMatch(desc1, trainDescriptors = desc2, k = 2) #2

147 p1, p2, kp_pairs = filter_matches(kp1, kp2, raw_matches)

148 if len(p1) >= 4:

149 H, status = cv.findHomography(p1, p2, cv.RANSAC, 5.0)

150 print('%d / %d inliers/matched' % (np.sum(status), len(status)))

151 # do not draw outliers (there will be a lot of them)

152 kp_pairs = [kpp for kpp, flag in zip(kp_pairs, status) if flag]

153 else:

154 H, status = None, None

155 print('%d matches found, not enough for homography estimation' % len(p1))

156

157 explore_match(win, img1, img2, kp_pairs, None, H)

158

159

160 match_and_draw('affine find_obj')

161 cv.waitKey()

162 print('Done')

163

164

165 if __name__ == '__main__':

166 print(__doc__)

167 main()

168 cv.destroyAllWindows()



相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码