前回、Pythonで画像を表示しました。今回は、まず、前回のソースコードをもう少し詳しく解説していきます。

前回の復習

import matplotlib.pyplot as plt
import cv2


def show_image(image_path):
    """
    image_pathの画像を表示する関数
    :param str image_path: 画像のパス
    """
    image = cv2.imread(image_path)

    # 画像をBGR表現からRGB表現に変更する
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

    plt.imshow(image)
    plt.show()


if __name__ == '__main__':
    show_image('./data/ryu.png')

各行の説明をより詳細に追加してみました。


変数の中身をコマンドラインから見てみよう

コマンドラインに出力する方法は、「Hello World!!」と出力したときに使ったprint関数を使います。

まずは、image_pathの中身を見てみよう。

9行目と10行目の間に次のソースコードを入れてみよう。

# 変数の中身をそのまま表示する
print(image_path)
# 変数の型を確認する。type関数を用いる。
print(type(image_path))

出力結果は次のようになります。

中学校でやった数学でも、変数に値を代入し、計算を行なったことことがあると思います。プログラミングでは、変数に数値以外にも文字列など様々な値をセットすることができます。

それでは、画像の中身も同様に出力してみましょう。

# 変数の中身をそのまま表示する
print(image)

# 変数の型を確認する。type関数を用いる。
print(type(image))

これを実行すると次のような結果が出てきます。

まずは、print(type(image))の出力結果 <class ‘numpy.ndarray’>について説明していきます。

ここでのポイントは、「numpy」です。前回、環境構築をした際に、「conda install numpy」コマンドを使用して、numpyライブラリをインストールしました。しかしながら、プログラムの一番上に記述しているライブラリのインポートでは、「numpy」をインポートしていません。実は、OpenCV(cv2)では、画像をnumpyのndarray型という型で値を保持しています。

numpyのndarrayとは?

ndarrayは、同じサイズ、同じ型が入っている(ほとんどの場合固定の)多次元の配列です。

https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.ndarray.html

この説明を理解するためには、「配列」について理解する必要があります。プログラミングを行なったことがある人であれば、馴染みのある単語ですが、初めての人には馴染みのない言葉かと思います。「配列」はプログラムを学ぶ上で大事なキーワードです。ここで理解しましょう。

配列は、データの持ち方の1つです。例えば、5人のテストの点数を配列を使わなかった場合と使った場合を比較してみましょう。

配列を使わなかった場合

# データのセット
ten_1 = 60
ten_2 = 75
ten_3 = 80
ten_4 = 67
ten_5 = 90

 # データの出力
print(ten_1)
print(ten_2)
print(ten_3)
print(ten_4)
print(ten_5)

実行結果

このように、配列がないと、一つづつ変数を定義する必要があります。しかし、配列を使うと、少し簡単に書けます。

配列を使った場合

# データのセット
ten_list = [60, 75, 80, 67, 90]

# データの出力
# 配列からデータを取り出すときは、何番目を取り出すかを指定する。
print(ten_list[0])
print(ten_list[1])
print(ten_list[2])
print(ten_list[3])
print(ten_list[4])

実行結果

このように、「配列」を使うとデータをセットするのが簡単です。

多次元配列について知ろう

先ほどの点数を格納した配列を1次元配列と言います。では、2次元配列とはどのようなものでしょうか?例えば、2次元配列では、次のようなデータを持つことが出来ます。

実際にプログラムで書く場合は、以下のようになります。

# データのセット
ten_array = [[60, 75, 80, 67, 90],
             [80, 85, 90, 78, 95],
             [56, 70, 45, 80, 70],
             [60, 65, 55, 60, 70],
             [45, 70, 50, 80, 65]]

# Aさんの理科の点数を取り出すとき
print(ten_array[0][3])

# Dさんの英語の点数を取り出すとき
print(ten_array[3][2])

今回は、まず配列を知ることに重点を置くため、あえて説明しませんが、この後登場する繰り返し文「for文」と合わせて使うことが多いです。また、配列操作も別途説明を行います。配列操作を覚えることで、配列に自由に値を追加、更新、削除等を行うことが出来ます。

画像における配列は?

print(image)をした際に、出力された[[[255 255 255] [255 255 255] … [255 255 255]]]は、imageの中身が多すぎたために、途中が省略されている。3×3の小さいな画像の場合は、次のようになります。

終わりに

今回は、画像を取得し、プログラムで取得する方法の詳細を説明しました。また、それに伴い配列の簡単な説明を行いました。配列操作や画像操作はまだまだ多くの種類があります。別の記事でそれらについて説明していきます。

1件のコメント

  1. ピンバック: Pyhton入門-画像を表示しよう- – りゅう先生のIT学び場

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です