質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

3343閲覧

【画像処理】windowsのエクスプローラでサムネイルを表示するとき、元画像にどんな圧縮をかけているか知りたいです

ysk_snn

総合スコア21

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/07/21 05:36

編集2020/07/21 07:28

前提・実現したいこと

単純に興味だけであって、困っているわけではないのですが、
windowsのエクスプローラで画像のサムネイルを表示するとき、
いつも違和感なくサイズだけ変わっていてすごいなと思いました。(処理も早い)

opencvではcv2.resizeのinterpolationとして、

  • cv2.INTER_NEAREST 最近傍補間
  • cv2.INTER_LINEAR バイリニア補間(デフォルト)
  • cv2.INTER_AREA 平均画素法
  • cv2.INTER_CUBIC 4×4 の近傍領域を利用するバイキュービック補間
  • cv2.INTER_LANCZOS4 8×8 の近傍領域を利用する Lanczos法の補間

がありますが、
cv2.INTER_AREAにかなり近いのではないかと思っています。

画像処理に詳しい方がいたら、サムネイル表示の際にはどんな処理が行われていて、
もし分かればその理由も教えていただけないでしょうか。
よろしくお願いいたします。

イメージ説明

試したこと

ここに問題に対して試したことを記載してください。

666×666 個の半径5の円が並んだ水玉模様画像に対して、上記の手法で圧縮をかけて、
100×100 pixelの画像にしたところ、やはり見た目的にはcv2.INTER_AREAが一番似ていて、
その他の3手法はあまり違いが分かりません。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

適当に黒地に白と灰色の矩形を書いた画像のサムネイルを表示させて
そのスクリーンショットを撮ってみました.

画像の上側がサムネイルのスクリーンショットを(もちろん補間無しで)拡大したもので,
下側は,適当にペイントで塗りつぶしを行ってみた結果です.

とりあえず,バイキュービックやLanczosのような広い範囲を見た補間では無さそうな気がしますが…はたして?

イメージ説明

投稿2020/07/21 06:34

編集2020/07/21 06:35
fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2020/07/21 08:35

縮小倍率から処理を選択的に変えたりとかも考えられるし, 「手法Aである程度まで縮小して,そこに手法Bを用いて最終サイズに縮小」みたいな合わせ技(?)とかも考えられるか…… 現物から見ていくなら,こんな1例だけではなく,もっといろんなパターンのIN/OUTから推測する必要があるのかも.
guest

0

Windowsのサムネイル画像の縮小アルゴリズムについて調べてみましたが、分かりませんでした。

ただ、サムネイル画像は同階層にある隠しファイルthumbs.dbに格納されています。
Thumbs.dbのフォーマット調べて抽出ツール作ったによると、画像は無圧縮で暗号化もされていない状態で格納されているようなので、まずはそれらを抽出します。
抽出はUtility to batch extract images from a thumbs.db thumbnail databaseによるとVinettoでできるようです。
あとは元画像を各種アルゴリズムで縮小した結果と比較すれば、どのアルゴリズムを使っているか見当がつくかと思います。

投稿2020/07/21 05:51

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

サムネイル表示の際にはどんな処理が行われていて、もし分かればその理由も教えていただけないでしょうか。

Windows はオープンソースでないので、中の人でないと、補完方式になにを使っているかを知るのは難しいかと思います。

最近傍補間以外の上記にあげた補完方式は、どれを使っても人の目で見てわかる違いはほぼないのではないでしょうか。画像処理のりサイズには、速度と品質の観点からバイリニア補間が一般的に使われます。cv2.INTER_AREA、cv2.INTER_LANCZOS は、バイリニア補完に比べて処理時間が大きくかかるので、1フォルダに何千枚の画像を表示するような状況を考慮すると、使われている可能性は低いと思います。サムネイルなので、画質より速度が重要です。

OpenCV - resize で画像をリサイズする方法 - pystyle

バイリニア補完でアスペクト比を固定してリサイズすれば、エクスプローラーに表示されるのと同等の画像は作成できると思います。

python

1import cv2 2 3 4def scale_box(img, width, height): 5 """指定した大きさに収まるように、アスペクト比を固定して、リサイズする。 6 """ 7 h, w = img.shape[:2] 8 aspect = w / h 9 if width / height >= aspect: 10 nh = height 11 nw = round(nh * aspect) 12 else: 13 nw = width 14 nh = round(nw / aspect) 15 16 dst = cv2.resize(img, dsize=(nw, nh)) 17 18 return dst 19 20 21img = cv2.imread("sample.jpg") 22dst = scale_box(img, 150, 150) 23print(f"{img.shape} -> {dst.shape}")

イメージ説明

イメージ説明

追記

thumbs.db は 256x256 に fit するようにアスペクト比を固定してリサイズし、jpeg 形式に圧縮して保存されているようです。

  1. thumbs.db に格納されている画像
  2. 元画像を (256, 256) にアスペクト比を固定してリサイズし、jpeg で圧縮してから再読み込みした画像

の2つを作成し、輝度値の差分の平均をとったところ、たしかに INTER_AREA が一番差分が小さいようですね。

python

1import cv2 2import numpy as np 3import pandas as pd 4 5img1 = cv2.imread("original.jpg") # 元画像 6img2 = cv2.imread("thumbs.jpg") # thumbs.db から抽出した画像 7 8 9def scale_box(img, width, height, interpolation): 10 """指定した大きさに収まるように、アスペクト比を固定して、リサイズする。 11 """ 12 h, w = img.shape[:2] 13 aspect = w / h 14 if width / height >= aspect: 15 nh = height 16 nw = round(nh * aspect) 17 else: 18 nw = width 19 nh = round(nw / aspect) 20 21 dst = cv2.resize(img, dsize=(nw, nh), interpolation=interpolation) 22 23 img_bytes = cv2.imencode(".jpg", dst)[1] 24 dst = cv2.imdecode(img_bytes, cv2.IMREAD_UNCHANGED) 25 26 return dst 27 28 29interpolations = { 30 "cv2.INTER_NEAREST": cv2.INTER_NEAREST, 31 "cv2.INTER_LINEAR": cv2.INTER_LINEAR, 32 "cv2.INTER_CUBIC": cv2.INTER_CUBIC, 33 "cv2.INTER_AREA": cv2.INTER_AREA, 34 "cv2.INTER_LANCZOS4": cv2.INTER_LANCZOS4, 35} 36 37results = [] 38for name, interpolation in interpolations.items(): 39 img3 = scale_box(img1, 256, 256, interpolation) 40 41 diff = np.abs(img3.astype(int) - img2.astype(int)).sum() / img3.size 42 43 results.append( 44 {"interpolation": name, "diff": f"{diff:.2f}",} 45 ) 46results = pd.DataFrame(results) 47results
interpolationdiff
0cv2.INTER_NEAREST8.84
1cv2.INTER_LINEAR6.05
2cv2.INTER_CUBIC6.67
3cv2.INTER_AREA3.51
4cv2.INTER_LANCZOS46.71

投稿2020/07/21 05:49

編集2020/07/21 14:52
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2020/07/21 06:03

> 画質より速度 (他回答にて挙げられていますが)Thumbs.dbなるキャッシュが存在するので,ある程度頑張った処理な可能性もあるのではないでしょうか.
tiitoi

2020/07/21 06:13 編集

確かに可能性はありますね。ただ、元画像の10%、20%に縮小するような状況では補間方式で目に見える差はおそらくないでしょうし、バイリニアより計算コストが10倍以上する補完方式を採用するメリットが果たしてあるのだろうかと思います。
ysk_snn

2020/07/21 07:36

いくつかパターンをつくって圧縮をかけてみているのですが、cv2.INTER_AREAがすごくサムネイルの画像に近い画像になって、それ以外の手法だと見た目に違いがあんまり判らない、という感じです。 また、cv2.INTER_AREA以外の手法だと、画像中に一定の周期でパターンが描かれていると、強め合ったり弱めあったりしてしまって、元画像と印象が変わるような気がしています。
tiitoi

2020/07/21 08:08

Windows はソースが公開されていないので、Microsoft が公開している情報から補完形式に関する情報が得られないのだとしたら、thumb.db から画像を取り出して、各圧縮形式との diff をとり、diff が少ない補完形式が使われていると推測する他ないと思います。 OpenCV で提供されている方式以外の独自の方法の可能性もなくはなので、この質問は近い補完形式を見つけることはできても、真の答えを知るのは難しいのではないかと思います。
fana

2020/07/21 08:22

定期的なパターンの絵柄を著しく縮小するような場合,INTER_AREAは(他とは違って)結果画素値が,元画像の広い範囲の平均値的になる(んだと思う)ので,かなり平滑化されて細かいパターンが見えにくくなる. INTER_AREAが似ているのであれば,何かしらLPF的な雰囲気の処理なのかな?…という感じですかね.
tiitoi

2020/07/21 14:44

thumbs.db のものを抽出して比較してみたら、たしかに INTER_AREA が一番差分が小さくなりました。なので、それに類似した方法を使っているのかもしれません。
ysk_snn

2020/07/22 03:01

とても分かりやすくて感動しています! 初歩的な話過ぎて申し訳ないのですが、 実際に自分もやってみたいと思ってプログラムを動かしたところ、 img2 = cv2.imread("thumbs.jpg") の部分で、私の場合img2 が Type: NoneType String form: None Docstring: となってしまいました... thumbsがないのが原因だとは思うのですが、 エクスプローラのオプションで縮小版が表示される設定になっていることを確認していますし、 実際に縮小版サムネイルも表示されるので、なぜthumbsが現れないのかわかりません... ご存じでしたら教えていただけませんでしょうか...?
tiitoi

2020/07/22 03:16 編集

original.jpg が元画像で、それがおいてあるフォルダの thumbs.db に保存されている画像を手動で取り出したものが thumbs.jpg です。取り出す処理は手動です。 取り出して保存するのは、以下のツールを使いました。thumbs.db を以下のツールで開いて該当の画像を探し、右クリックの 「Save Selected」で保存しました。 https://thumbsviewer.github.io/ thumbs.db は Explorer の設定の「保護されたオペレーティングファイルを表示しない」のチェックを外さないと Explorer から見えません
ysk_snn

2020/07/22 04:19

ツールのご紹介までありがとうございます。 > thumbs.db は Explorer の設定の「保護されたオペレーティングファイルを表示しない」のチェックを外さないと Explorer から見えません 外しているのですが、desktop.iniという環境設定ファイルが出てくるだけで、thumbs.dbは出てきません...
tiitoi

2020/07/22 05:43

画像ファイルがあるディレクトリと同じ場所に作られませんか? だとしたら thumbs.db を作らない設定になっているとかでしょうか? 「windows thumbs.db 作らない」とかで検索して、作らない設定になっていないか確認してはどうでしょうか。
ysk_snn

2020/07/22 08:53

いちおうあれこれ調べてみまして、 https://koneta.nifty.com/koneta_detail/170220000222_1.htm ここを参考に、 「視覚効果」タブ内で「カスタム」にチェックを入れ、「アイコンの代わりに縮小版を表示する」のチェックが入っていることを確認して、 フォルダを開いて「表示」→「オプション」と進み、「フォルダーオプション」内の表示タブで、「隠しファイル、隠しフォルダー、および隠しドライブを表示する」にチェックをいれてあることを確認しております。 https://www.qam-web.com/?p=12022 またここを参考に、 「コントロールパネル」を開いて→「システムとセキュリティ」→「システム」と進み、左メニューから「システムの詳細設定」を選択。 さらに、「詳細設定」を選択し、「パフォーマンス」項目中の「設定」ボタンをクリック、チェックボックスがたくさん出てくるので、「アイコンの代わりに縮小版を表示する」のチェックが入っていることを確認してもみました。 https://moondoldo.com/wordpress/?p=461 ここを参考に、 非表示のthumbs.dbファイルで縮小表示のキャッシュを無効にする]が[未構成]になっていることも確認しました。 おそらくはthumbs.dbを作成する設定になっていて、それを表示するようにしているのですが、表示されない状況です。 もともとの質問からずれてしまって本当に申し訳ございません... また、これから少しの間PCをいじれなくなるのでこちらからの回答が遅くなってしまうと思います...
tiitoi

2020/07/22 09:03 編集

というか自分も今確認したところ、新しいフォルダ作ってそこに画像入れてみたら、thumbs.db が作られないですね。検証した際に使った画像があるディレクトリは win7 時代からあるものなので、そこにあった thumbs.db がいつ作られたのかわからないです。 なんかのタイミングで作られるか、いつの間にか thumb.db が廃止になったのかはわかりません。 質問とは別問題だと思うので、一旦クローズして新しく質問を立てたほうがよいのではないでしょうか。
ysk_snn

2020/07/29 00:55

確かにそうですね、、、 自分で試してみたくもあったのですが、 数値で比較して差異がきちんと分かった点にはすっきりしました! ありがとうございます!
guest

0

まずバイキュービック(やLanczos)っぽくはないです。
これらは急峻なエッジがあると周辺でオーバーシュートが見られます。
しかしWindowsのサムネイルはこれがなく、元画像に含まれる色とその中間色しか見られません。

また、バイリニアっぽくもないです。
バイリニアでは極端に縮小すると、元画像のごく一部のピクセルしか出力に影響を与えないため、細い線は途切れます。
Windowsのサムネイルにはこれがありません。
(下図右は1万px程度の画像を縮小したものです)

平均画素法はオーバーシュートを起こさず元画像のすべての画素が出力に影響しますので、確かに観測によく合いますね。
バイキュービックとバイリニアとWindowsのサムネイル
なお縮小はClip Studio Paintで行いました。
最初はGIMPで試したのですが、「キュービック」ではオーバーシュートが出ず「線形」では不思議な乱れ方をして、どうも単純なバイリニアやバイキュービックとは異なるアルゴリズムを使っているようです。

投稿2020/07/22 18:39

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ysk_snn

2020/07/27 02:25

バイキュービック、バイリニアではなさそうという理由がすごく分かりやすいです! 画像の特徴や縮小率によって手法をミックスしているかもしれませんが、 >最初はGIMPで試したのですが... 同じ手法名でもアプリやライブラリによって処理内容が違うこともあるのですかね... これもまた勉強になりました...!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問