|
|
matplotlib Image tutorial. |
H.Kamifuji . |
Matplotlib で画像をプロットするための短いチュートリアル。 matplotlib 3.8.1 の Examples では、代替サンプルがみつかりません。 |
まず、IPython を起動しましょう。 標準的な Python プロンプトに対して最も優れた拡張機能であり、特に Matplotlib との結びつきがあります。 シェルで IPython を起動するか、IPython Notebook を起動してください。 IPython を起動したら、GUI イベントループに接続する必要があります。 これは IPython にプロットを表示する場所(そしてその方法)を伝えます。 GUI ループに接続するには、IPython プロンプトで %matplotlib マジックを実行します。 GUI イベントループに関する IPython のドキュメント には、これが何をするかについての詳細があります。 IPython ノートブックを使用している場合は、同じコマンドを使用できますが、一般的に人々は %matplotlib マジックに対する特定の引数を使用します。 In [1]: %matplotlib inlineインラインプロットがオンになり、プロットグラフィックがノートブックに表示されます。これは対話性に重要な意味を持ちます。インラインプロットの場合、プロットを出力するセルの下のセルのコマンドはプロットに影響しません。たとえば、プロットを作成するセルの下のセルからカラーマップを変更することはできません。しかし、Qt5 などの別のバックエンドで別のウィンドウを開くと、プロットを作成するものの下のセルがプロットを変更します。これはメモリ内のライブオブジェクトです。 このチュートリアルでは、matplotlib の命令形式の作図インタフェース、pyplot を使用します。このインターフェイスはグローバルな状態を維持し、さまざまなプロット設定をすばやく簡単に試すのに非常に便利です。その代わりに、オブジェクト指向のインターフェイスもあります。これは非常に強力で、大規模なアプリケーション開発に適しています。オブジェクト指向のインターフェイスについて知りたい場合は、使い方のガイドを参考にしてください。今のところ、命令的スタイルのアプローチを試してみましょう。 import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np |
画像データの読み込みは、Pillow ライブラリでサポートされています。 ネイティブに、Matplotlib は PNG 画像のみをサポートします。 以下のコマンドは、ネイティブの読み込みが失敗した場合にピローに戻ります。 この例で使用されている画像は PNG ファイルですが、自分のデータには枕の要件を念頭に置いてください。 ここで私たちがやり遂げる予定のイメージは次のとおりです。 ![]() それは 24 ビットの RGB PNG 画像です(R、G、B それぞれ 8 ビット)。 データを取得する場所によって、最も遭遇する可能性のある他の種類の画像は、透過性または単一チャネルのグレースケール(光度)画像を可能にするRGBA画像です。 このチュートリアルの残りの部分を右クリックし、「画像を別名で保存」を選択してコンピュータにダウンロードすることができます。 さあ、いくぞ... img = mpimg.imread('../../doc/_static/stinkbug.png') print(img)出力 [[[0.40784314 0.40784314 0.40784314] [0.40784314 0.40784314 0.40784314] [0.40784314 0.40784314 0.40784314] ... [0.42745098 0.42745098 0.42745098] [0.42745098 0.42745098 0.42745098] [0.42745098 0.42745098 0.42745098]] [[0.4117647 0.4117647 0.4117647 ] [0.4117647 0.4117647 0.4117647 ] [0.4117647 0.4117647 0.4117647 ] ... [0.42745098 0.42745098 0.42745098] [0.42745098 0.42745098 0.42745098] [0.42745098 0.42745098 0.42745098]] [[0.41960785 0.41960785 0.41960785] [0.41568628 0.41568628 0.41568628] [0.41568628 0.41568628 0.41568628] ... [0.43137255 0.43137255 0.43137255] [0.43137255 0.43137255 0.43137255] [0.43137255 0.43137255 0.43137255]] ... [[0.4392157 0.4392157 0.4392157 ] [0.43529412 0.43529412 0.43529412] [0.43137255 0.43137255 0.43137255] ... [0.45490196 0.45490196 0.45490196] [0.4509804 0.4509804 0.4509804 ] [0.4509804 0.4509804 0.4509804 ]] [[0.44313726 0.44313726 0.44313726] [0.44313726 0.44313726 0.44313726] [0.4392157 0.4392157 0.4392157 ] ... [0.4509804 0.4509804 0.4509804 ] [0.44705883 0.44705883 0.44705883] [0.44705883 0.44705883 0.44705883]] [[0.44313726 0.44313726 0.44313726] [0.4509804 0.4509804 0.4509804 ] [0.4509804 0.4509804 0.4509804 ] ... [0.44705883 0.44705883 0.44705883] [0.44705883 0.44705883 0.44705883] [0.44313726 0.44313726 0.44313726]]]そこに dtype があることに注意してください - float32。 Matplotlib は、各チャンネルからの 8 ビットデータを 0.0 ? 1.0 の浮動小数点データにリサイズしました。補足として、Pillow が扱える唯一のデータ型は uint8 です。 Matplotlib のプロットは float32 と uint8 を処理できますが、PNG 以外の形式の画像の読み書きは uint8 データに制限されています。なぜ 8 ビットですか?ほとんどのディスプレイは、チャネルごとに 8 ビットの色階調しか表示できません。なぜ 8 ビット/チャンネルしかレンダリングできないのですか?それは人間の目のすべてが見ることができるからです。詳細はこちら(写真の観点から):光景のビット深度のチュートリアル。 各内側のリストはピクセルを表します。ここでは、RGB 画像には 3 つの値があります。それは白黒画像なので、R、G、B はすべて似ています。 RGBA ( A はアルファまたは透明)はインナーリストごとに 4 つの値を持ち、単純な輝度画像はちょうど1つの値を持ちます(したがって 3D 配列で>はなく 2-D 配列のみです)。 RGB および RGBA 画像の場合、matplotlib は float32 および uint8 データ型をサポートします。グレースケールの場合、matplotlibはfloat32 のみをサポートします。配列データがこれらの記述のいずれかを満たしていない場合は、それを再スケーリングする必要があります。 |
そのため、データをインポートするか、生成するかのどちらかで、データを配列に並べます。 それをレンダリングしましょう。 Matplotlib では、これは imshow() 関数を使用して実行されます。 ここでは、プロットオブジェクトを取得します。 このオブジェクトは、プロンプトからプロットを操作する簡単な方法を提供します。imgplot = plt.imshow(img) ![]() 任意の数の配列をプロットすることもできます |
場合によっては、画像のコントラストを強調したり、特定の領域のコントラストを拡大したり、色の違いを犠牲にしたり、重要でない色を犠牲にすることがあります。 興味深い領域を見つけるための良いツールは、ヒストグラムです。 画像データのヒストグラムを作成するには、hist() 関数を使用します。import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np img = mpimg.imread('./stinkbug.png') print(img) # lum_img = img[:, :, 0] lum_img = img[:, :] print(lum_img) plt.hist(lum_img.ravel(), bins=256, range=(0.0, 1.0), fc='k', ec='k') plt.show() ![]() ![]() ほとんどの場合、画像の "interesting" 部分はピークの周りにあり、頂点の上および/または下の領域をクリッピングすることによって余分なコントラストを得ることができます。 私たちのヒストグラムでは、ハイエンドにはあまり有益な情報がないように見えます(画像の白い物はあまりありません)。 上限を調整して、ヒストグラムの一部を効果的に「拡大( "zoom in on" )」しましょう。 これを行うには clim 引数を imshow に渡します。 また、イメージプロットオブジェクトの set_clim() メソッドを呼び出すことでこれを行うこともできますが、IPython ノートブックで作業するときは、プロットコマンドと同じセルで行うようにしてください。 plot の呼び出しで clim を指定することができます。 import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np img = mpimg.imread('./stinkbug.png') print(img) # lum_img = img[:, :, 0] lum_img = img[:, :] print(lum_img) imgplot = plt.imshow(lum_img, clim=(0.0, 0.7)) plt.show() ![]() ![]() 返されたオブジェクトを使用して clim を指定することもできます import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np img = mpimg.imread('./stinkbug.png') print(img) # lum_img = img[:, :, 0] lum_img = img[:, :] print(lum_img) fig = plt.figure() a = fig.add_subplot(1, 2, 1) imgplot = plt.imshow(lum_img) a.set_title('Before') plt.colorbar(ticks=[0.1, 0.3, 0.5, 0.7], orientation='horizontal') a = fig.add_subplot(1, 2, 2) imgplot = plt.imshow(lum_img) imgplot.set_clim(0.0, 0.7) a.set_title('After') plt.colorbar(ticks=[0.1, 0.3, 0.5, 0.7], orientation='horizontal') plt.show() ![]() ![]() |
補間は、異なる数学的スキームに従って、ピクセルの色または値が何であるべきかを計算する。 これが起こる 1 つの一般的な場所は、画像のサイズを変更するときです。 ピクセル数は変わりますが、同じ情報が必要です。 ピクセルは離散的なので、スペースがありません。 補間はその空間をどのように埋めるかです。 これは、あなたの画像が吹き飛ばされたときに時々ピクセル化して見えるようになる理由です。 この効果は、元の画像と拡大された画像との差が大きい場合に顕著である。 私たちのイメージを取り、縮小しましょう。 効果的にピクセルを破棄しているだけで、少数の選択肢しか保持しません。 今私たちがそれをプロットすると、そのデータは画面上のサイズまで吹き飛ばされます。 古いピクセルはもはや存在せず、コンピュータはその空間を埋めるためにピクセルで描画する必要があります。 画像の読み込みに使用した Pillow ライブラリを使用して、画像のサイズを変更します。 import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np from PIL import Image img = Image.open('./stinkbug.png') img.thumbnail((64, 64), Image.ANTIALIAS) # resizes image in-place imgplot = plt.imshow(img) plt.show() ![]() ![]() Python 3.11.6 では、下記の警告表示されます。 M:\______\Image_tutorial_09.py:7: DeprecationWarning: ANTIALIAS is deprecated and will be removed in Pillow 10 (2023-07-01). Use LANCZOS or Resampling.LANCZOS instead. img.thumbnail((64, 64), Image.ANTIALIAS) # resizes image in-placePython 3.12.0 では、下記のエラー表示され、実行できない。 Traceback (most recent call last): File "E:\______\Image_tutorial_09.py", line 7, inimshow() に補間引数を与えなかったので、ここではデフォルトの補間、bilinear があります。 いくつか他のものを試してみましょう。 ここでは補間を行わない "nearest" があります。 import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np from PIL import Image img = Image.open('./stinkbug.png') img.thumbnail((64, 64), Image.ANTIALIAS) # resizes image in-place imgplot = plt.imshow(img, interpolation="nearest") plt.show() ![]() ![]() Python 3.11.6 では、下記の警告表示されます。 M:\______\Image_tutorial_10.py:7: DeprecationWarning: ANTIALIAS is deprecated and will be removed in Pillow 10 (2023-07-01). Use LANCZOS or Resampling.LANCZOS instead. img.thumbnail((64, 64), Image.ANTIALIAS) # resizes image in-placePython 3.12.0 では、下記のエラー表示され、実行できない。 Traceback (most recent call last): File "E:\______\Image_tutorial_10.py", line 7, in次は、bicubic : import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np from PIL import Image img = Image.open('./stinkbug.png') img.thumbnail((64, 64), Image.ANTIALIAS) # resizes image in-place imgplot = plt.imshow(img, interpolation="bicubic") plt.show() ![]() ![]() バイキュービック補間は、写真を吹き飛ばすときによく使用されます。人々は、ピクセル化されたものに比べてぼやける傾向があります。 Python 3.11.6 では、下記の警告表示されます。 M:\______\Image_tutorial_11.py:7: DeprecationWarning: ANTIALIAS is deprecated and will be removed in Pillow 10 (2023-07-01). Use LANCZOS or Resampling.LANCZOS instead. img.thumbnail((64, 64), Image.ANTIALIAS) # resizes image in-placePython 3.12.0 では、下記のエラー表示され、実行できない。 Traceback (most recent call last): File "E:\______\Image_tutorial_11.py", line 7, in |
Image tutorial |
|