回答編集履歴

2

a

2018/12/04 10:14

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -17,3 +17,169 @@
17
17
  絶対値の差の平均が3だとしても 500x500 の画像の場合、約 750000 になります。
18
18
 
19
19
  画像全体の和をとっているので値もかなり大きくなると思います。
20
+
21
+
22
+
23
+ ----
24
+
25
+
26
+
27
+ ## 追記
28
+
29
+
30
+
31
+ * SAD の値は式からわかるように画像の大きさに依存するので、値がいくつ未満なら類似していると見なすかという基準はありません。
32
+
33
+ * SAD はテンプレートマッチングを行う際に、テンプレート画像と比較対象領域の類似度の計算には使えますが、画像の類似度を比較する目的では普通使わないと思います。
34
+
35
+
36
+
37
+ 類似度比較でしたら、以下のように色のヒストグラムを計算し、そのヒストグラムの類似度で判断するのはどうでしょうか。
38
+
39
+
40
+
41
+ 1. HSV に変換する。
42
+
43
+ 2. Hue のヒストグラムを計算する。
44
+
45
+ 3. ヒストグラムを正規化する。
46
+
47
+ 4. ヒストグラムを比較する。
48
+
49
+
50
+
51
+
52
+
53
+ ```python
54
+
55
+ import os
56
+
57
+
58
+
59
+ import cv2
60
+
61
+ import matplotlib.pyplot as plt
62
+
63
+
64
+
65
+ # 画像を読み込む。
66
+
67
+ base = cv2.imread('sample1.jpg') # 画像 きつねの画像
68
+
69
+ test1 = cv2.imread('sample2.jpg') # 比較対象画像1 猫の画像
70
+
71
+ test2 = cv2.imread('sample3.jpg') # 比較対象画像2 きつねの画像を一旦縮小して拡大して荒くしたもの
72
+
73
+ test3 = cv2.imread('sample4.jpg') # 比較対象画像3 もちの画像
74
+
75
+
76
+
77
+
78
+
79
+ def create_hist(img):
80
+
81
+ '''ヒストグラムを作成する。
82
+
83
+ '''
84
+
85
+ # HSV に変換する。
86
+
87
+ hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
88
+
89
+ # 色相だけでヒストグラムを作成する。
90
+
91
+ hist = cv2.calcHist([hsv], [0], None, histSize=[256], ranges=[0, 256])
92
+
93
+ # ヒストグラムを正規化する。
94
+
95
+ cv2.normalize(hist, hist)
96
+
97
+
98
+
99
+ return hist
100
+
101
+
102
+
103
+
104
+
105
+ def test_similarity(img1, img2):
106
+
107
+ hist1 = create_hist(img1)
108
+
109
+ hist2 = create_hist(img2)
110
+
111
+ comp = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
112
+
113
+ print('similarity:', comp)
114
+
115
+
116
+
117
+ fig, [ax1, ax2] = plt.subplots(1, 2, figsize=(8, 4))
118
+
119
+ ax1.plot(hist1)
120
+
121
+ ax2.plot(hist2)
122
+
123
+ plt.show()
124
+
125
+
126
+
127
+ fig, [ax1, ax2] = plt.subplots(1, 2, figsize=(8, 4))
128
+
129
+ ax1.imshow(img1[..., ::-1])
130
+
131
+ ax1.axis('off')
132
+
133
+ ax2.imshow(img2[..., ::-1])
134
+
135
+ ax2.axis('off')
136
+
137
+ plt.show()
138
+
139
+
140
+
141
+
142
+
143
+ test_similarity(base, test1)
144
+
145
+ test_similarity(base, test2)
146
+
147
+ test_similarity(base, test3)
148
+
149
+ ```
150
+
151
+
152
+
153
+ ```
154
+
155
+ similarity: 0.6695568360090015
156
+
157
+ similarity: 0.9996917363691143
158
+
159
+ similarity: 0.7705205449656316
160
+
161
+ ```
162
+
163
+
164
+
165
+ ![イメージ説明](3c149f30d399ec1f6ef24ef52c1f5a61.png)
166
+
167
+
168
+
169
+ ![イメージ説明](4d936b1fa368cc7eb629ec2aabf626d4.png)
170
+
171
+
172
+
173
+ ![イメージ説明](2e65b5e3a15e645c7b60c5264aae47e6.png)
174
+
175
+
176
+
177
+ ![イメージ説明](6a8078600ddf49df7dc32986d0b86631.png)
178
+
179
+
180
+
181
+ ![イメージ説明](84a9e6d43bebf552711d7efb8095046f.png)
182
+
183
+
184
+
185
+ ![イメージ説明](0d7d4807b60bf6a37387c9d3eebd9d7b.png)

1

d

2018/12/04 10:14

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -14,6 +14,6 @@
14
14
 
15
15
 
16
16
 
17
- 平均の絶対値の差が3だとしても 500, 500 の画像の場合、約 750000 になります。
17
+ 絶対値の差の平均が3だとしても 500x500 の画像の場合、約 750000 になります。
18
18
 
19
- 画像全体の和
19
+ 画像全体の和をとっているので値もかなり大きくなると思います。