teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

a

2018/12/04 10:14

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -7,4 +7,87 @@
7
7
  > 値は出るのですが想像以上に数値が大きく、合っているのかわかりません
8
8
 
9
9
  絶対値の差の平均が3だとしても 500x500 の画像の場合、約 750000 になります。
10
- 画像全体の和をとっているので値もかなり大きくなると思います。
10
+ 画像全体の和をとっているので値もかなり大きくなると思います。
11
+
12
+ ----
13
+
14
+ ## 追記
15
+
16
+ * SAD の値は式からわかるように画像の大きさに依存するので、値がいくつ未満なら類似していると見なすかという基準はありません。
17
+ * SAD はテンプレートマッチングを行う際に、テンプレート画像と比較対象領域の類似度の計算には使えますが、画像の類似度を比較する目的では普通使わないと思います。
18
+
19
+ 類似度比較でしたら、以下のように色のヒストグラムを計算し、そのヒストグラムの類似度で判断するのはどうでしょうか。
20
+
21
+ 1. HSV に変換する。
22
+ 2. Hue のヒストグラムを計算する。
23
+ 3. ヒストグラムを正規化する。
24
+ 4. ヒストグラムを比較する。
25
+
26
+
27
+ ```python
28
+ import os
29
+
30
+ import cv2
31
+ import matplotlib.pyplot as plt
32
+
33
+ # 画像を読み込む。
34
+ base = cv2.imread('sample1.jpg') # 画像 きつねの画像
35
+ test1 = cv2.imread('sample2.jpg') # 比較対象画像1 猫の画像
36
+ test2 = cv2.imread('sample3.jpg') # 比較対象画像2 きつねの画像を一旦縮小して拡大して荒くしたもの
37
+ test3 = cv2.imread('sample4.jpg') # 比較対象画像3 もちの画像
38
+
39
+
40
+ def create_hist(img):
41
+ '''ヒストグラムを作成する。
42
+ '''
43
+ # HSV に変換する。
44
+ hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
45
+ # 色相だけでヒストグラムを作成する。
46
+ hist = cv2.calcHist([hsv], [0], None, histSize=[256], ranges=[0, 256])
47
+ # ヒストグラムを正規化する。
48
+ cv2.normalize(hist, hist)
49
+
50
+ return hist
51
+
52
+
53
+ def test_similarity(img1, img2):
54
+ hist1 = create_hist(img1)
55
+ hist2 = create_hist(img2)
56
+ comp = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
57
+ print('similarity:', comp)
58
+
59
+ fig, [ax1, ax2] = plt.subplots(1, 2, figsize=(8, 4))
60
+ ax1.plot(hist1)
61
+ ax2.plot(hist2)
62
+ plt.show()
63
+
64
+ fig, [ax1, ax2] = plt.subplots(1, 2, figsize=(8, 4))
65
+ ax1.imshow(img1[..., ::-1])
66
+ ax1.axis('off')
67
+ ax2.imshow(img2[..., ::-1])
68
+ ax2.axis('off')
69
+ plt.show()
70
+
71
+
72
+ test_similarity(base, test1)
73
+ test_similarity(base, test2)
74
+ test_similarity(base, test3)
75
+ ```
76
+
77
+ ```
78
+ similarity: 0.6695568360090015
79
+ similarity: 0.9996917363691143
80
+ similarity: 0.7705205449656316
81
+ ```
82
+
83
+ ![イメージ説明](3c149f30d399ec1f6ef24ef52c1f5a61.png)
84
+
85
+ ![イメージ説明](4d936b1fa368cc7eb629ec2aabf626d4.png)
86
+
87
+ ![イメージ説明](2e65b5e3a15e645c7b60c5264aae47e6.png)
88
+
89
+ ![イメージ説明](6a8078600ddf49df7dc32986d0b86631.png)
90
+
91
+ ![イメージ説明](84a9e6d43bebf552711d7efb8095046f.png)
92
+
93
+ ![イメージ説明](0d7d4807b60bf6a37387c9d3eebd9d7b.png)

1

d

2018/12/04 10:14

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -6,5 +6,5 @@
6
6
 
7
7
  > 値は出るのですが想像以上に数値が大きく、合っているのかわかりません
8
8
 
9
- 平均の絶対値の差が3だとしても 500, 500 の画像の場合、約 750000 になります。
9
+ 絶対値の差の平均が3だとしても 500x500 の画像の場合、約 750000 になります。
10
- 画像全体の和
10
+ 画像全体の和をとっているので値もかなり大きくなると思います。