回答編集履歴
6
修正
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
修正
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
修正
answer
CHANGED
@@ -45,13 +45,64 @@
|
|
45
45
|
1. thumbs.db に格納されている画像
|
46
46
|
2. 元画像を (256, 256) にアスペクト比を固定してリサイズし、jpeg で圧縮してから再読み込みした画像
|
47
47
|
|
48
|
-
の2つを作成し、
|
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
|
-
|
102
|
+
| | interpolation | diff |
|
103
|
+
|---:|:-------------------|-------:|
|
52
|
-
0
|
104
|
+
| 0 | cv2.INTER_NEAREST | 8.84 |
|
53
|
-
1
|
105
|
+
| 1 | cv2.INTER_LINEAR | 6.05 |
|
54
|
-
2
|
106
|
+
| 2 | cv2.INTER_CUBIC | 6.67 |
|
55
|
-
3
|
107
|
+
| 3 | cv2.INTER_AREA | 3.51 |
|
56
|
-
4
|
108
|
+
| 4 | cv2.INTER_LANCZOS4 | 6.71 |
|
57
|
-
```
|
3
修正
answer
CHANGED
@@ -36,4 +36,22 @@
|
|
36
36
|
|
37
37
|

|
38
38
|
|
39
|
-

|
39
|
+

|
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
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
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
|
|