回答編集履歴

6

修正

2020/07/21 14:52

投稿

tiitoi
tiitoi

スコア21954

test CHANGED
@@ -174,15 +174,13 @@
174
174
 
175
175
  for name, interpolation in interpolations.items():
176
176
 
177
- # 計算時間を評価する。
178
-
179
177
  img3 = scale_box(img1, 256, 256, interpolation)
180
178
 
181
179
 
182
180
 
183
181
  diff = np.abs(img3.astype(int) - img2.astype(int)).sum() / img3.size
184
182
 
185
- # 画質を評価する。
183
+
186
184
 
187
185
  results.append(
188
186
 

5

修正

2020/07/21 14:52

投稿

tiitoi
tiitoi

スコア21954

test CHANGED
@@ -106,9 +106,9 @@
106
106
 
107
107
 
108
108
 
109
- img1 = cv2.imread("original.jpg")
109
+ img1 = cv2.imread("original.jpg") # 元画像
110
-
110
+
111
- img2 = cv2.imread("thumbs.jpg")
111
+ img2 = cv2.imread("thumbs.jpg") # thumbs.db から抽出した画像
112
112
 
113
113
 
114
114
 

4

修正

2020/07/21 14:50

投稿

tiitoi
tiitoi

スコア21954

test CHANGED
@@ -92,22 +92,124 @@
92
92
 
93
93
 
94
94
 
95
- の2つを作成し、平均の差分をとったところ、たしかに INTER_AREA が一番差分が小さいようですね。
95
+ の2つを作成し、輝度値の差分の平均をとったところ、たしかに INTER_AREA が一番差分が小さいようですね。
96
+
97
+
98
+
96
-
99
+ ```python
100
+
97
-
101
+ import cv2
102
+
103
+ import numpy as np
104
+
105
+ import pandas as pd
106
+
107
+
108
+
109
+ img1 = cv2.imread("original.jpg")
110
+
111
+ img2 = cv2.imread("thumbs.jpg")
112
+
113
+
114
+
115
+
116
+
117
+ def scale_box(img, width, height, interpolation):
118
+
119
+ """指定した大きさに収まるように、アスペクト比を固定して、リサイズする。
120
+
121
+ """
122
+
123
+ h, w = img.shape[:2]
124
+
125
+ aspect = w / h
126
+
127
+ if width / height >= aspect:
128
+
129
+ nh = height
130
+
131
+ nw = round(nh * aspect)
132
+
133
+ else:
134
+
135
+ nw = width
136
+
137
+ nh = round(nw / aspect)
138
+
139
+
140
+
141
+ dst = cv2.resize(img, dsize=(nw, nh), interpolation=interpolation)
142
+
143
+
144
+
145
+ img_bytes = cv2.imencode(".jpg", dst)[1]
146
+
147
+ dst = cv2.imdecode(img_bytes, cv2.IMREAD_UNCHANGED)
148
+
149
+
150
+
151
+ return dst
152
+
153
+
154
+
155
+
156
+
157
+ interpolations = {
158
+
159
+ "cv2.INTER_NEAREST": cv2.INTER_NEAREST,
160
+
161
+ "cv2.INTER_LINEAR": cv2.INTER_LINEAR,
162
+
163
+ "cv2.INTER_CUBIC": cv2.INTER_CUBIC,
164
+
165
+ "cv2.INTER_AREA": cv2.INTER_AREA,
166
+
167
+ "cv2.INTER_LANCZOS4": cv2.INTER_LANCZOS4,
168
+
169
+ }
170
+
171
+
172
+
173
+ results = []
174
+
175
+ for name, interpolation in interpolations.items():
176
+
177
+ # 計算時間を評価する。
178
+
179
+ img3 = scale_box(img1, 256, 256, interpolation)
180
+
181
+
182
+
183
+ diff = np.abs(img3.astype(int) - img2.astype(int)).sum() / img3.size
184
+
185
+ # 画質を評価する。
186
+
187
+ results.append(
188
+
189
+ {"interpolation": name, "diff": f"{diff:.2f}",}
190
+
191
+ )
192
+
193
+ results = pd.DataFrame(results)
194
+
195
+ results
98
196
 
99
197
  ```
100
198
 
199
+
200
+
201
+
202
+
101
- interpolation mean_abs_diff
203
+ | | interpolation | diff |
204
+
102
-
205
+ |---:|:-------------------|-------:|
206
+
103
- 0 cv2.INTER_NEAREST 8.84
207
+ | 0 | cv2.INTER_NEAREST | 8.84 |
104
-
208
+
105
- 1 cv2.INTER_LINEAR 6.05
209
+ | 1 | cv2.INTER_LINEAR | 6.05 |
106
-
210
+
107
- 2 cv2.INTER_CUBIC 6.67
211
+ | 2 | cv2.INTER_CUBIC | 6.67 |
108
-
212
+
109
- 3 cv2.INTER_AREA 3.51
213
+ | 3 | cv2.INTER_AREA | 3.51 |
110
-
214
+
111
- 4 cv2.INTER_LANCZOS4 6.71
215
+ | 4 | cv2.INTER_LANCZOS4 | 6.71 |
112
-
113
- ```

3

修正

2020/07/21 14:49

投稿

tiitoi
tiitoi

スコア21954

test CHANGED
@@ -75,3 +75,39 @@
75
75
 
76
76
 
77
77
  ![イメージ説明](4341ed902e6e84ea37eca547fc2d391d.jpeg)
78
+
79
+
80
+
81
+ ## 追記
82
+
83
+
84
+
85
+ thumbs.db は 256x256 に fit するようにアスペクト比を固定してリサイズし、jpeg 形式に圧縮して保存されているようです。
86
+
87
+
88
+
89
+ 1. thumbs.db に格納されている画像
90
+
91
+ 2. 元画像を (256, 256) にアスペクト比を固定してリサイズし、jpeg で圧縮してから再読み込みした画像
92
+
93
+
94
+
95
+ の2つを作成し、平均の差分をとったところ、たしかに INTER_AREA が一番差分が小さいようですね。
96
+
97
+
98
+
99
+ ```
100
+
101
+ interpolation mean_abs_diff
102
+
103
+ 0 cv2.INTER_NEAREST 8.84
104
+
105
+ 1 cv2.INTER_LINEAR 6.05
106
+
107
+ 2 cv2.INTER_CUBIC 6.67
108
+
109
+ 3 cv2.INTER_AREA 3.51
110
+
111
+ 4 cv2.INTER_LANCZOS4 6.71
112
+
113
+ ```

2

s

2020/07/21 14:43

投稿

tiitoi
tiitoi

スコア21954

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

1

d

2020/07/21 05:55

投稿

tiitoi
tiitoi

スコア21954

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