回答編集履歴
6
修正
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
修正
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
修正
test
CHANGED
@@ -92,22 +92,124 @@
|
|
92
92
|
|
93
93
|
|
94
94
|
|
95
|
-
の2つを作成し、
|
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
|
-
|
203
|
+
| | interpolation | diff |
|
204
|
+
|
102
|
-
|
205
|
+
|---:|:-------------------|-------:|
|
206
|
+
|
103
|
-
0
|
207
|
+
| 0 | cv2.INTER_NEAREST | 8.84 |
|
104
|
-
|
208
|
+
|
105
|
-
1
|
209
|
+
| 1 | cv2.INTER_LINEAR | 6.05 |
|
106
|
-
|
210
|
+
|
107
|
-
2
|
211
|
+
| 2 | cv2.INTER_CUBIC | 6.67 |
|
108
|
-
|
212
|
+
|
109
|
-
3
|
213
|
+
| 3 | cv2.INTER_AREA | 3.51 |
|
110
|
-
|
214
|
+
|
111
|
-
4
|
215
|
+
| 4 | cv2.INTER_LANCZOS4 | 6.71 |
|
112
|
-
|
113
|
-
```
|
3
修正
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
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
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
|
|