合っていると思います。
vec1, vec2 = src.reshape(-1), temp.reshape(-1)
は reshape せずそのまま
return np.sum(np.abs(src- temp))
とできます。
値は出るのですが想像以上に数値が大きく、合っているのかわかりません
絶対値の差の平均が3だとしても 500x500 の画像の場合、約 750000 になります。
画像全体の和をとっているので値もかなり大きくなると思います。
追記
- SAD の値は式からわかるように画像の大きさに依存するので、値がいくつ未満なら類似していると見なすかという基準はありません。
- SAD はテンプレートマッチングを行う際に、テンプレート画像と比較対象領域の類似度の計算には使えますが、画像の類似度を比較する目的では普通使わないと思います。
類似度比較でしたら、以下のように色のヒストグラムを計算し、そのヒストグラムの類似度で判断するのはどうでしょうか。
- HSV に変換する。
- Hue のヒストグラムを計算する。
- ヒストグラムを正規化する。
- ヒストグラムを比較する。
python
1import os
2
3import cv2
4import matplotlib.pyplot as plt
5
6# 画像を読み込む。
7base = cv2.imread('sample1.jpg') # 画像 きつねの画像
8test1 = cv2.imread('sample2.jpg') # 比較対象画像1 猫の画像
9test2 = cv2.imread('sample3.jpg') # 比較対象画像2 きつねの画像を一旦縮小して拡大して荒くしたもの
10test3 = cv2.imread('sample4.jpg') # 比較対象画像3 もちの画像
11
12
13def create_hist(img):
14 '''ヒストグラムを作成する。
15 '''
16 # HSV に変換する。
17 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
18 # 色相だけでヒストグラムを作成する。
19 hist = cv2.calcHist([hsv], [0], None, histSize=[256], ranges=[0, 256])
20 # ヒストグラムを正規化する。
21 cv2.normalize(hist, hist)
22
23 return hist
24
25
26def test_similarity(img1, img2):
27 hist1 = create_hist(img1)
28 hist2 = create_hist(img2)
29 comp = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
30 print('similarity:', comp)
31
32 fig, [ax1, ax2] = plt.subplots(1, 2, figsize=(8, 4))
33 ax1.plot(hist1)
34 ax2.plot(hist2)
35 plt.show()
36
37 fig, [ax1, ax2] = plt.subplots(1, 2, figsize=(8, 4))
38 ax1.imshow(img1[..., ::-1])
39 ax1.axis('off')
40 ax2.imshow(img2[..., ::-1])
41 ax2.axis('off')
42 plt.show()
43
44
45test_similarity(base, test1)
46test_similarity(base, test2)
47test_similarity(base, test3)
similarity: 0.6695568360090015
similarity: 0.9996917363691143
similarity: 0.7705205449656316
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/04 07:12
2018/12/04 13:25 編集
2018/12/05 05:39
2018/12/05 06:00
2018/12/05 06:46
2018/12/06 23:31