Python入門トップページ


目次

  1. scikit-image のインストール
  2. Matplotlib による画像の表示
  3. 表示関数の定義
  4. RGBA から RGB への変換
  5. グレースケールをイメージする
  6. RGB からグレースケールへの変換
    1. RGB 平均
    2. ITU-R Rec BT.602
    3. Contemporary CRT phosphors (Rec 709)
    4. 3種類の比較
    5. scikit-image の rgb2gray 関数
  7. 平均化フィルタ
    1. 平均化フィルタの自作
    2. 平均化フィルタの一般化
    3. scikit-image の平均化フィルタ関数
  8. ガウシアンフィルタ
  9. バイラテラルフィルタ
  10. ランダムノイズとフィルタ
  11. ソーベルフィルタ
    1. ソーベルフィルタの自作
    2. scikit-image の sobel 関数
    3. 平均化/ガウシアンフィルタとソーベルフィルタの併用

画像フィルタの作成と利用

表示関数の定義

ここでは,matplotlib の様々なオプションを指定して画像を表示させるための show 関数と,画像の一部を拡大表示してグレースケールについては画素ごとに色情報も表示できる show_zoom_with_color 関数を定義します.まず,後で利用するものも含めて必要なライブラリをインポートします.

import numpy as np
from skimage import color
from skimage import filters
from skimage import restoration
from skimage import util

import matplotlib.pyplot as plt
# 次の2行は高解像度ディスプレイ対応
from IPython.display import set_matplotlib_formats
# from matplotlib_inline.backend_inline import set_matplotlib_formats # バージョンによってはこちらを有効に
set_matplotlib_formats('retina')

次に,show 関数を定義します.

def show(img,
         cmap=plt.cm.gray,
         file_name = 'output.png',
         figsize=(6,6),
         set_axis_off= False,
         save_png=True,
         dpi=300):
    fig, ax = plt.subplots(1, 1, figsize=figsize, constrained_layout=True)
    ax.imshow(img, cmap=cmap)
    if set_axis_off:
        ax.set_axis_off()
    if save_png:
        plt.savefig(file_name, dpi=dpi, facecolor='white')
    plt.show()

グレースケールの画像を表示して,色情報を画素に出力する show_zoom_with_color 関数も定義しておきます.

def show_zoom_with_color(
          img,
          cmap=plt.cm.gray,
          xlim=(0,10),
          ylim=(10, 0),
          fontsize=12,
          figsize=(6,6),
          show_color=True,
          file_name='output.png',
          save_png=True,
          set_axis_off=False,
          dpi=300,
      ):
    fig, ax = plt.subplots(1, 1, figsize=figsize, constrained_layout=True)
    ax.imshow(img, cmap=cmap)
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)
    if show_color:
        for y in range(int(ylim[1]+1), int(ylim[0]+1)):
            for x in range(int(xlim[0]+1), int(xlim[1]+1)):
                gray = int(img[y,x]*255+0.5) # 四捨五入
                if gray > 127:
                    color = 'black'
                else:
                    color = 'white'
                ax.text(x, y, gray,
                    linespacing=1, size=fontsize,
                    verticalalignment='center',
                    horizontalalignment='center',
                    color=color)
    if set_axis_off:
        ax.set_axis_off()
    if save_png:
        plt.savefig(file_name, dpi=dpi, facecolor='white')
    plt.show()

関数 show にオプショナル引数を指定しない場合は,画面に表示されるだけでなく,カレントディレクトリに output.png というファイル名で保存されます.そのときに保存されるファイルの解像度が 300dpi になります.

ink_img = plt.imread('ink.png')
show(ink_img)
filters_01_ink-rgb

書き出されるファイル名を指定するには file_name 引数を利用します.

ink_img = plt.imread('ink.png')
show(ink_img, file_name='output_ink.png')
filters_01_ink-rgb

ファイルに書き出す必要がない場合は save_png 引数に False を指定します.

ink_img = plt.imread('ink.png')
show(ink_img, save_png=False)
filters_01_ink-rgb

軸メモリを消去するには set_asis_off 引数に True を指定します.

ink_img = plt.imread('ink.png')
show(ink_img, set_axis_off=True)
filters_00_ink_noaxis

ファイルに書き出す際のデフォルトの解像度は 300dpi です.これを変更するには dpi 引数を指定します.例えば 50dpi で書き出した場合は次のようになります.上の結果と比較すると,軸メモリの値の表示が荒くなっていることが確認できるはずです.

ink_img = plt.imread('ink.png')
show(ink_img, dpi=50)
filters_00_ink_50dpi

目次に戻る