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

回答編集履歴

6

修正

2020/07/21 14:52

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -86,11 +86,10 @@
86
86
 
87
87
  results = []
88
88
  for name, interpolation in interpolations.items():
89
- # 計算時間を評価する。
90
89
  img3 = scale_box(img1, 256, 256, interpolation)
91
90
 
92
91
  diff = np.abs(img3.astype(int) - img2.astype(int)).sum() / img3.size
93
- # 画質を評価する。
92
+
94
93
  results.append(
95
94
  {"interpolation": name, "diff": f"{diff:.2f}",}
96
95
  )

5

修正

2020/07/21 14:52

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -52,8 +52,8 @@
52
52
  import numpy as np
53
53
  import pandas as pd
54
54
 
55
- img1 = cv2.imread("original.jpg")
55
+ img1 = cv2.imread("original.jpg") # 元画像
56
- img2 = cv2.imread("thumbs.jpg")
56
+ img2 = cv2.imread("thumbs.jpg") # thumbs.db から抽出した画像
57
57
 
58
58
 
59
59
  def scale_box(img, width, height, interpolation):

4

修正

2020/07/21 14:50

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -45,13 +45,64 @@
45
45
  1. thumbs.db に格納されている画像
46
46
  2. 元画像を (256, 256) にアスペクト比を固定してリサイズし、jpeg で圧縮してから再読み込みした画像
47
47
 
48
- の2つを作成し、平均の差分をとったところ、たしかに INTER_AREA が一番差分が小さいようですね。
48
+ の2つを作成し、輝度値の差分の平均をとったところ、たしかに INTER_AREA が一番差分が小さいようですね。
49
49
 
50
+ ```python
51
+ import cv2
52
+ import numpy as np
53
+ import pandas as pd
54
+
55
+ img1 = cv2.imread("original.jpg")
56
+ img2 = cv2.imread("thumbs.jpg")
57
+
58
+
59
+ def scale_box(img, width, height, interpolation):
60
+ """指定した大きさに収まるように、アスペクト比を固定して、リサイズする。
61
+ """
62
+ h, w = img.shape[:2]
63
+ aspect = w / h
64
+ if width / height >= aspect:
65
+ nh = height
66
+ nw = round(nh * aspect)
67
+ else:
68
+ nw = width
69
+ nh = round(nw / aspect)
70
+
71
+ dst = cv2.resize(img, dsize=(nw, nh), interpolation=interpolation)
72
+
73
+ img_bytes = cv2.imencode(".jpg", dst)[1]
74
+ dst = cv2.imdecode(img_bytes, cv2.IMREAD_UNCHANGED)
75
+
76
+ return dst
77
+
78
+
79
+ interpolations = {
80
+ "cv2.INTER_NEAREST": cv2.INTER_NEAREST,
81
+ "cv2.INTER_LINEAR": cv2.INTER_LINEAR,
82
+ "cv2.INTER_CUBIC": cv2.INTER_CUBIC,
83
+ "cv2.INTER_AREA": cv2.INTER_AREA,
84
+ "cv2.INTER_LANCZOS4": cv2.INTER_LANCZOS4,
85
+ }
86
+
87
+ results = []
88
+ for name, interpolation in interpolations.items():
89
+ # 計算時間を評価する。
90
+ img3 = scale_box(img1, 256, 256, interpolation)
91
+
92
+ diff = np.abs(img3.astype(int) - img2.astype(int)).sum() / img3.size
93
+ # 画質を評価する。
94
+ results.append(
95
+ {"interpolation": name, "diff": f"{diff:.2f}",}
96
+ )
97
+ results = pd.DataFrame(results)
98
+ results
50
99
  ```
100
+
101
+
51
- interpolation mean_abs_diff
102
+ | | interpolation | diff |
103
+ |---:|:-------------------|-------:|
52
- 0 cv2.INTER_NEAREST 8.84
104
+ | 0 | cv2.INTER_NEAREST | 8.84 |
53
- 1 cv2.INTER_LINEAR 6.05
105
+ | 1 | cv2.INTER_LINEAR | 6.05 |
54
- 2 cv2.INTER_CUBIC 6.67
106
+ | 2 | cv2.INTER_CUBIC | 6.67 |
55
- 3 cv2.INTER_AREA 3.51
107
+ | 3 | cv2.INTER_AREA | 3.51 |
56
- 4 cv2.INTER_LANCZOS4 6.71
108
+ | 4 | cv2.INTER_LANCZOS4 | 6.71 |
57
- ```

3

修正

2020/07/21 14:49

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -36,4 +36,22 @@
36
36
 
37
37
  ![イメージ説明](114c38cb6917ce7b546ab9044971df51.jpeg)
38
38
 
39
- ![イメージ説明](4341ed902e6e84ea37eca547fc2d391d.jpeg)
39
+ ![イメージ説明](4341ed902e6e84ea37eca547fc2d391d.jpeg)
40
+
41
+ ## 追記
42
+
43
+ thumbs.db は 256x256 に fit するようにアスペクト比を固定してリサイズし、jpeg 形式に圧縮して保存されているようです。
44
+
45
+ 1. thumbs.db に格納されている画像
46
+ 2. 元画像を (256, 256) にアスペクト比を固定してリサイズし、jpeg で圧縮してから再読み込みした画像
47
+
48
+ の2つを作成し、平均の差分をとったところ、たしかに INTER_AREA が一番差分が小さいようですね。
49
+
50
+ ```
51
+ interpolation mean_abs_diff
52
+ 0 cv2.INTER_NEAREST 8.84
53
+ 1 cv2.INTER_LINEAR 6.05
54
+ 2 cv2.INTER_CUBIC 6.67
55
+ 3 cv2.INTER_AREA 3.51
56
+ 4 cv2.INTER_LANCZOS4 6.71
57
+ ```

2

s

2020/07/21 14:43

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -2,11 +2,12 @@
2
2
 
3
3
  Windows はオープンソースでないので、中の人でないと、補完方式になにを使っているかを知るのは難しいかと思います。
4
4
 
5
- 最近傍補間以外の上記にあげた補完方式は、どれを使っても人の目で見てわかる違いはほぼないのではないでしょうか。画像処理のりサイズには、速度と品質の観点からバイリニア補間が一般的に使われます。
6
- バイリニア補完でアスペクト比を固定してリサイズすれば、エクスプローラーに表示されるのと同等の画像は作成できると思います。
5
+ 最近傍補間以外の上記にあげた補完方式は、どれを使っても人の目で見てわかる違いはほぼないのではないでしょうか。画像処理のりサイズには、速度と品質の観点からバイリニア補間が一般的に使われます。cv2.INTER_AREA、cv2.INTER_LANCZOS は、バイリニア補完に比べて処理時間が大きくかかるので、1フォルダに何千枚の画像を表示するような状況を考慮すると、使われている可能性は低いと思います。サムネイルなので、画質より速度が重要です。
7
6
 
8
7
  [OpenCV - resize で画像をリサイズする方法 - pystyle](https://pystyle.info/opencv-resize/#outline__3_5)
9
8
 
9
+ バイリニア補完でアスペクト比を固定してリサイズすれば、エクスプローラーに表示されるのと同等の画像は作成できると思います。
10
+
10
11
  ```python
11
12
  import cv2
12
13
 

1

d

2020/07/21 05:55

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -5,6 +5,8 @@
5
5
  最近傍補間以外の上記にあげた補完方式は、どれを使っても人の目で見てわかる違いはほぼないのではないでしょうか。画像処理のりサイズには、速度と品質の観点からバイリニア補間が一般的に使われます。
6
6
  バイリニア補完でアスペクト比を固定してリサイズすれば、エクスプローラーに表示されるのと同等の画像は作成できると思います。
7
7
 
8
+ [OpenCV - resize で画像をリサイズする方法 - pystyle](https://pystyle.info/opencv-resize/#outline__3_5)
9
+
8
10
  ```python
9
11
  import cv2
10
12