画像の読み込み、ROI選択、グレースケール変換

Python

はじめに

Pythonによる画像解析の第一歩は、対象となる画像をプログラムに読み込み、基本的な操作を行うことから始まります。一見地味な作業ですが、ここをしっかり押さえることが、後の高度な解析へのスムーズなステップアップに繋がります。

本記事では、画像解析の定番ライブラリであるOpenCVと、グラフ描画ライブラリのMatplotlibを使い、以下の3つの基本操作をマスターします。

  1. 画像の読み込みと表示
  2. グレースケール(白黒)画像への変換
  3. ROI(Region of Interest: 関心領域)の切り出し

準備:ライブラリのインストール

まだインストールしていない場合は、ターミナルやコマンドプロンプトで以下のコマンドを実行してください。

pip install opencv-python
pip install matplotlib
pip install numpy

OpenCVは内部でNumPyという数値計算ライブラリを利用するため、合わせてインストールしておきます。

1. 画像の読み込みと表示

まずは、解析したい画像をPythonに読み込んでみましょう。ここではsample.jpgというファイル名の画像が、Pythonスクリプトと同じフォルダにあると仮定します。

今回はランダムに作成した下記の画像を用いて、コードを確認してみましょう。sample.jpgは白黒、sample2.jpgはカラー像となります。

画像を読み込む

cv2.imread()関数を使うことで、簡単に画像を読み込めます。

import cv2
import matplotlib.pyplot as plt

# 画像を読み込む
# cv2.IMREAD_COLOR: カラー画像として読み込む(デフォルト)
# cv2.IMREAD_GRAYSCALE: グレースケールで読み込む
img_path = 'sample.jpg'
img_color = cv2.imread(img_path, cv2.IMREAD_COLOR)

# 画像が正しく読み込めたか確認
if img_color is None:
    print(f"エラー: 画像ファイルが見つかりません: {img_path}")
else:
    print("画像が正常に読み込まれました。")
    print(f"画像のサイズ(高さ, 幅, チャンネル数): {img_color.shape}")
    print(f"画像のデータ型: {img_color.dtype}")

img_color.shapeは、画像の(高さ, 幅, チャンネル数)をタプルで返します。カラー画像なので、チャンネル数は3(青、緑、赤)となります。

【重要】OpenCVとMatplotlibの色の順序

ここで一つ注意点です。OpenCVで画像を読み込むと、色の順序が**BGR(青、緑、赤)になります。一方、Matplotlibで画像を表示する際の色の順序はRGB(赤、緑、青)**です。

そのため、OpenCVで読み込んだ画像をそのままMatplotlibで表示すると、色が正しく表示されません。cv2.cvtColor()関数を使って、BGRからRGBに変換する必要があります。

画像を表示する

Matplotlibを使って、読み込んだ画像を表示してみましょう。

# BGRからRGBへ変換
img_rgb = cv2.cvtColor(img_color, cv2.COLOR_BGR2RGB)

# Matplotlibで画像を表示
plt.figure(figsize=(8, 6)) # 表示する図のサイズを調整
plt.imshow(img_rgb)
plt.title('Original Color Image (RGB)')
plt.axis('off') # 軸のメモリは不要なので消す
plt.show()
sample.jpg
sample2.jpg

問題なければ、上記の画像が表示されるはずです。

2. グレースケール画像への変換

顕微鏡画像解析では、色の情報が不要な場合や、輝度(明るさ)の情報だけに着目したい場合が多々あります。そのようなケースでは、画像をグレースケールに変換するのが一般的です。

変換はcv2.cvtColor()関数で簡単に行えます。

# カラー画像をグレースケールに変換
img_gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)

print(f"グレースケール画像のサイズ(高さ, 幅): {img_gray.shape}")

# グレースケール画像を表示
plt.figure(figsize=(8, 6))
# cmap='gray'を指定することで、白黒の濃淡で表示される
plt.imshow(img_gray, cmap='gray') 
plt.title('Grayscale Image')
plt.axis('off')
plt.show()
sample.jpgを用いた結果
sample2の画像を用いた結果

グレースケール画像は色の情報を持たないため、shapeのチャンネル数がなくなり、(高さ, 幅)の2次元配列になります。

3. ROI(関心領域)の切り出し

画像全体ではなく、特定の領域だけを解析したい場合も頻繁にあります。例えば、視野の中心部分だけ、あるいは特定の欠陥が含まれる部分だけを切り出すようなケースです。

OpenCVで読み込んだ画像はNumPy配列なので、配列のスライス機能を使って簡単にROIを切り出すことができます。

# ROIを切り出す(NumPyのスライス機能を利用)
# 配列[開始y:終了y, 開始x:終了x]
# 例:y座標100-300, x座標200-400の範囲を切り出す
roi = img_rgb[100:300, 200:400]

# ROIを表示
plt.figure(figsize=(4, 3))
plt.imshow(roi)
plt.title('Region of Interest (ROI)')
plt.axis('off')
plt.show()
sample2の画像を用いた結果

座標の指定が[y, x]の順番であることに注意してください。

まとめ

今回は、Pythonで画像解析を行うための最も基本的な操作を学びました。

  • cv2.imread()で画像を読み込む
  • OpenCV(BGR)とMatplotlib(RGB)の色の違いを理解し、cv2.cvtColor()で変換する
  • plt.imshow()で画像を表示する
  • NumPyスライスで簡単にROIを切り出す

これらの操作は、今後のあらゆる画像解析の基礎となります。何度もコードを書いて、確実に身につけておきましょう。

次回は、いよいよ画像解析の本質に迫る**「前処理」**に入ります。まずは、画像に含まれるノイズを除去するための、様々なフィルタリング技術について学んでいきましょう。

コメント