質問編集履歴

2

画像の説明の追加

2020/10/22 08:19

投稿

Moririn_1881
Moririn_1881

スコア18

test CHANGED
File without changes
test CHANGED
@@ -178,8 +178,14 @@
178
178
 
179
179
  ```
180
180
 
181
+ 下はテンプレート画像を92%に縮小したものです。
182
+
181
183
  ![テンプレート画像を92%に縮小したもの](227f03b95803ad5aef31010b78c3d61b.png)
182
184
 
185
+
186
+
187
+ 負の値となり、矩形はグラフ外に出て不可視となっています。
188
+
183
189
  ![イメージ説明](d62f250685b5b101655e0374a6e691a7.png)
184
190
 
185
191
 

1

実装したコードとその問題点を載せました。

2020/10/22 08:19

投稿

Moririn_1881
Moririn_1881

スコア18

test CHANGED
File without changes
test CHANGED
@@ -60,4 +60,136 @@
60
60
 
61
61
 
62
62
 
63
+ なお想定としては、
64
+
65
+ ・スケール変換はおよそ50%~200%
66
+
67
+ ・ノイズはpng→jpg変換で生ずる程度のもの
68
+
69
+
70
+
71
+ と考えております。
72
+
63
73
  どのように解決すればよろしいか、お教えしてくださると助かります。
74
+
75
+
76
+
77
+ ### **追記(POCの実装)**
78
+
79
+ 位相限定相関法を実装した結果、ノイズに対しては十分に耐性を持っていることが確認できました。ありがとうございます。
80
+
81
+ 下に実装コードを示します。
82
+
83
+
84
+
85
+ ```Python
86
+
87
+ import cv2
88
+
89
+ import numpy as np
90
+
91
+
92
+
93
+ from matplotlib import pyplot as plt
94
+
95
+ import matplotlib.patches as patches
96
+
97
+
98
+
99
+ img = cv2.imread("ai/ai.png", 0) # 元画像
100
+
101
+ template = cv2.imread("ai/ai_part_x92.png", 0) # マッチング対象のテンプレート画像
102
+
103
+ im_h, im_w = img.shape # 元画像のサイズ取得
104
+
105
+ temp_h, temp_w = template.shape # テンプレート画像のサイズ取得
106
+
107
+
108
+
109
+ template = cv2.copyMakeBorder(
110
+
111
+ template,
112
+
113
+ 0,
114
+
115
+ im_h - temp_h,
116
+
117
+ 0,
118
+
119
+ im_w - temp_w,
120
+
121
+ cv2.BORDER_CONSTANT,
122
+
123
+ (0, 0, 0),
124
+
125
+ ) # POCができるようにテンプレート画像をパディング
126
+
127
+
128
+
129
+ shift, theta_shift = cv2.phaseCorrelate(
130
+
131
+ template.astype(np.float32), img.astype(np.float32)
132
+
133
+ ) # POCでシフト量を取得
134
+
135
+
136
+
137
+ rect = patches.Rectangle(
138
+
139
+ xy=(shift), width=temp_w, height=temp_h, ec="b", fill=False
140
+
141
+ ) # テンプレートと一致する部分を四角形で表示
142
+
143
+
144
+
145
+ # 図示
146
+
147
+ plt.subplot(121), plt.imshow(img, cmap="gray")
148
+
149
+ plt.subplot(121).add_patch(rect)
150
+
151
+ plt.title("Input Image"), plt.xticks([]), plt.yticks([])
152
+
153
+ plt.subplot(122), plt.imshow(template, cmap="gray")
154
+
155
+ plt.title("Template Image (92%)"), plt.xticks([]), plt.yticks([])
156
+
157
+ plt.show()
158
+
159
+
160
+
161
+ print(shift) # 最後にシフト量を表示
162
+
163
+ ```
164
+
165
+ ![イメージ説明](c97943783f0d888d90ce4dc20d66f0b4.png)
166
+
167
+ ### 問題点
168
+
169
+
170
+
171
+ しかしながら、スケーリングの問題に関しては92%ほど縮小したテンプレート画像に対して、下のような出力になってしまい、いわば元画像の左上とパディングされたテンプレート画像の右下が一致してしまっております。
172
+
173
+ ```Python
174
+
175
+ >> print(shift)
176
+
177
+ # (-198.66021205773234, -197.0159913577939)
178
+
179
+ ```
180
+
181
+ ![テンプレート画像を92%に縮小したもの](227f03b95803ad5aef31010b78c3d61b.png)
182
+
183
+ ![イメージ説明](d62f250685b5b101655e0374a6e691a7.png)
184
+
185
+
186
+
187
+
188
+
189
+ >> 位相限定相関法とか,スケール自体も探索対象となっているような方法
190
+
191
+
192
+
193
+ と伺っていて、多少縮小したものでもうまくいくと思っておりましたが、パディングしたのが悪かったのでしょうか。
194
+
195
+ cv2.copyMakeBorder()において、二つの画像が同じサイズである必要があるので、パディングさせていただきました。何か良い対処法がございましたらお教えしてくださると助かります。