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. 平均化/ガウシアンフィルタとソーベルフィルタの併用

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

RGB からグレースケールへの変換

RGB 形式のカラー画像をグレースケールに変換するには scikit-image で提供される rgb2gray 関数を使うと良いでしょう.ここでは3種類のアルゴリズムを利用してグレースケールに変換する処理を記述してみます.なお,あらかじめ「表示関数の定義」ページを参照し,ライブラリのインポートと関数の定義を実行しておいてください.

RGB 平均

カラー画像をグレースケールに変換するときの最も単純なアルゴリズムは RGB 平均です.これは画素ごとに R, G, B の3つの値の平均値を計算し,その値を利用します.

\begin{equation} V = (R + G + B) / 3.0 \end{equation}

ink_img = plt.imread('ink.png')
img =  ink_img[:, :, 0:3] # アルファチャンネルを削除
h, w, a = img.shape # 画像の画素数 h : 高さ, w : 幅
rgb_mean_img = np.zeros((h, w)) # 初期化
# 画素ごとに (R + G + B) / 3 でグレーに変換する
for j in range(h):
    for i in range(w):
        rgb_mean_img[j, i] = (img[j, i, 0] + img[j, i, 1] + img[j, i, 2]) / 3.0
show(img)
show(rgb_mean_img)
filters_01_ink-rgb
filters_04_gray1

以前のページと同じ場所を拡大表示すると次のようになります.また,比較のために元のカラー画像も並べて表示します.


show_zoom_with_color(img,
    xlim=(50.5,59.5), ylim=(89.5, 80.5),
    figsize=(6,6), fontsize=6,
    show_color=False
)
show_zoom_with_color(rgb_mean_img,
    xlim=(50.5,59.5), ylim=(89.5, 80.5),
    figsize=(6,6), fontsize=6,
)
filters_02_zoom3
filters_04_gray2

なお,この方法では「R,G,Bは同じ値でも見た目の明るさが違う」ことと「ガンマ補正で平均が歪む」という理由により,実感と合わない結果になりがちです.詳細はここを参照してください.

目次に戻る