演習: デジタル画像表現と色空間

1. 演習: デジタル画像表現と色空間#

1.1. はじめに#

レポートは テンプレートファイル を使用して作成してください。また、ファイル名は 「(7桁の学籍番号)_第x回_画像処理レポート.docx」 (xの部分は何回目の課題なのかを記入)に変更してください。

課題作成上の注意

課題を作成する際には、プログラムは別に .py ファイルで作成して、本レポートと一緒に圧縮したうえで提出してください。また、Jupyter Notebook形式のファイル (拡張子が.ipynb)のものは受け付けません。

加えて、プログラムを添付したのみで内容に関する説明や結果に関する考察のないもの、単なる結果の羅列になっているもの(またはそのように見えるもの)は採点しませんのでご注意ください。

1.1.1. OpenCVの基本#

OpenCVはコンピュータ・ビジョンのための様々な機能が用意されたC++のライブラリで、Pythonからも利用することができる。PipやAnacondaを用いる場合、以下のコマンドでインストールできる。

# Pipを用いる場合
pip install opencv-python
# Anacondaを用いる場合
conda install opencv

以後の課題では、画像の読み書きにOpenCVを用いることにしよう。OpenCVで画像を読み込むには cv2.imread を用いる。カラー画像として読み込みたい場合には第二引数に cv2.IMREAD_COLOR を指定する。すると、画像の情報がNumPyの配列として返ってくる。

import cv2

img = cv2.imread("sample.jpg", cv2.IMREAD_COLOR)
print(type(img))  # <class 'numpy.ndarray'>

この際、画像の大きさは「高さ × 幅」という順序でデータが格納されており、各画素値は np.uint8 型、すなわち8ビット符号なし整数で表されている。なお、OpenCVを用いて読み込んだ画像はチャンネルがBGRの順に並んでいるため、必要に応じてチャンネルの順序を入れ替える必要がある。

print(img.shape)  # (height, width, channels)
print(img.dtype)  # uint8

# チャンネル順序の入れ替え (OpenCVを使う場合)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# チャンネル順序の入れ替え (NumPyを使う場合)
img_rgb = np.flip(img, axis=2)

画像を保存するには、データを np.uint8 型に変換したうえで cv2.imwrite を用いる。

cv2.imwrite("sample_out.jpg", img)

OpenCVは様々な形式の画像の読み書きの対応しており、代表的なJPEG, PNG等の画像フォーマットであれば読み書きがサポートされている。

1.1.2. 画像の表示#

OpenCV等で読み込んだ画像を表示する場合にはMatplotlibの imshow を使う。

import matplotlib.pyplot as plt

plt.imshow(img_rgb)
plt.show()

ただし、Matplotlibは画像の輝度の最大値と最小値を見て、画像の画素値を自動的に正規化するので、0-255の階調で画像を表示したい場合には、 vminvmax を指定する必要がある。

plt.imshow(img_rgb, vmin=0, vmax=255)
plt.show()

また、グレースケールの画像を表示する場合、Matplotlibはデフォルトではカラーマップを自動的に適用してしまうので、 cmap="gray" を指定する必要がある。

plt.imshow(img_gray, cmap="gray", vmin=0, vmax=255)
plt.show()

より詳しいMatplotlibの使い方については各自インターネットや書籍等で調べること。

1.2. 演習問題#

問題1

グレースケール画像の計算

通常、カラー画像をグレースケール画像に変換する場合には、赤、緑、青の成分を (0.299, 0.587, 0.114) の比率で加重平均するのが一般的である。この比率で加重平均を取って作成したグレースケール画像と単純にRGBの値を平均して作成したグレースケール画像を比較し、どのような場合に前者の方法が有効かを考察せよ。

ヒント: モネの絵画 印象 日の出を入力画像にして実験してみよう。

問題2

ポスタリゼーション

多くのデジタル画像の色は、赤、緑、青のそれぞれのチャンネルの強度が256階調で表されていることを述べた。この階調を減らして、イラスト風の画像を作る処理を ポスタリゼーション と呼ぶ。画像を読み込み、指定した階調数に減色するポスタリゼーションのプログラムを作成せよ。

問題3

内側が塗りつぶされた円

画像のサイズを (512, 512) として、中心の座標と半径を指定すると、円の輪郭が黒で、円の内部が緑色で塗りつぶされた画像を表示するプログラムを作成しなさい。なお、円の輪郭線はアンチエイリアシングされていなくとも良い。

問題4

Bézier曲線とCatmull-Romスプライン曲線

Bézier曲線と類似したパラメトリック曲線に Catmull-Romスプライン曲線がある。3次のBézier曲線とCatmull-Romスプライン曲線はいずれも4点を制御点として曲線を定義する。

特定の4点を制御点としたときにBézier曲線を赤色で、Catmull-Romスプライン曲線を青色で描画するプログラムを作成し、これらの曲線の違いについて考察せよ。なお、制御点の位置はプログラム内にハードコーディングして良い。