質問編集履歴
2
画像の説明の追加
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
実装したコードとその問題点を載せました。
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()において、二つの画像が同じサイズである必要があるので、パディングさせていただきました。何か良い対処法がございましたらお教えしてくださると助かります。
|