Python

PythonのNumpyを使った画像処理

By 2021年7月22日No Comments

この記事では、近年、生活の中で欠かすことのできない画像処理について、簡単な処理の方法を解説します。

画像処理はディープラーニングや機械学習においても重要な要素なので、そちらの学習を考えている方もぜひ参考にしてください。

画像処理とは

カメラではセンサにおいて、被写体から発した光を検出してコンピュータが処理可能なデジタル信号に変換しています。

画像処理とは、カメラのセンサから得られたデジタル信号を処理することで、画像データを加工・合成したり、特性を読み取ったりする処理全般のことを表します。画像処理は主にコンピュータによって行われ、処理の内容に応じて適切なアルゴリズムを組むことが必要となります。

画像処理は近年あらゆる領域において重要な役目を果たしています。例えば、製品の欠陥検査があります。半導体の集積回路においては、回路を画像として認識して、欠陥の有無を判断しています。農業の分野では形が一様でない農作物の選別などにも用いられます。また、自動車の自動運転技術には高精度の画像処理、認識が大前提となります。このように画像処理技術によって、人間の目に代わる、またはそれ以上の精度で情報処理を行うことができます。

Numpyを使った画像処理

Pythonの外部ライブラリであるNumpyを使うことで様々な画像処理を行うことができます。今回は基本的な画像処理操作として

・画像の読み込み方

・処理した画像の保存の仕方

・画像の単色化などの処理

について解説していきます。

画像ファイルをNumpyの配列として読み込む方法

以下の画像を扱います。

画像の読み込みには外部ライブラリであるPillowのモジュールであるPIL.Image.open()を用います。外部ライブラリのインポートからプログラムを始めます。

from PIL import Image  # PillowライブラリからImageモジュールをインポートします。
import numpy as np

image = np.array(Image.open('Users/root/Pictures/image_1.img'))  # Image.open()の引数には画像の保存してあるパスを渡します。

print(type(image))
# <class 'numpy.ndarray'>

print(image.dtype)
# uint8

print(image.shape)  # (行, 列, 色)の3次元配列が得られます。色はRGBなので3。
# (1108, 1478, 3)

白黒画像にしてから変換すると2次元配列が得られます。
image_mono = np.array(Image.open('Users/root/Pictures/image_1.img')).convert(‘L’)

print(image.shape)  # 2次元配列が得られます。
# (1108, 1478)

画像を保存する方法

PIL_Image.fromarray()によってndarrayを変換し、save()メソッドによって画像ファイルとして保存することができます。

PIL_image = Image.fromarray(image)  # ndarrayを変換します。
print(type(PIL_Image))
# <class 'PIL.Image.Image'>

PIL_image.save('Users/root/Pictures/image_1_PIL.img')  # 関数の引数には保存したい場所を渡します。

numpy配列の中に小数などのfloat型の要素が入っている場合エラーになる。
PIL_image= Image.fromarray(image_f)
# TypeError: Cannot handle this data type

画素の値を取得、変更する

通常のNumpy配列のように画素の値を[ ]を使って取得、変更することができます。

image = np.array(Image.open('Users/root/Pictures/image_1.img'))

print(image[100, 100])
# [ 77 118 197]

Red, Green, Blue = image[100, 100]

print(Red)
# 77

print(Green)
# 118

print(Blue)
# 197

今回の例では101行101列目の画素における値を示しています。3つの要素が出力されたのは、RGBの各値が出力されているためです。そのため、変数を別々に用意することで、それぞれの値が出力されます。

値の変更も通常のNumpy配列と同じように行うことができます。

image[100, 100] = (100, 200, 255)
print(image[100, 100])
# [100 200 255]

画像の単色化

RGB値を変えることで全体的に単一の色の画像にすることができます。やり方としてはスライスをうまく利用して全体のRGBの値を操作します。

image = np.array(Image.open('Users/root/Pictures/image_1.img'))

image_Red = image.copy()
image_Red[:, :, 1] = 0  # 行列要素はそのままに、Greenの値をすべて0にします。
image_Red[:, :, 2] = 0  # 同様にBlueの値をすべて0にします。

PIL_image = Image.fromarray(image_Red)
PIL_image.save('Users/root/Pictures/image_Red.jpg')

同じように緑と青の単色の画像も作ってみます。

image_Green = image.copy()
image_Green[:, :, 0] = 0
image_Green[:, :, 2] = 0

PIL_image = Image.fromarray(image_Green)

PIL_image.save('Users/root/Pictures/image_Green.jpg')
image_Blue = image.copy()
image_Blue[:, :, 0] = 0
image_Blue[:, :, 1] = 0

PIL_image = Image.fromarray(image_Blue)
PIL_image.save('Users/root/Pictures/image_Blue.jpg')

また、扱っているのはNumpy配列なので簡単に結合など様々な操作を行うことができます。

image_RGB = np.concatenate((image_Red, image_Green, image_Blue), axis=0)
# 第一引数に結合したい配列、第二引数に軸を渡します。axis=0だと縦、axis=1だと横に結合します。
PIL_image = Image.fromarray(image_RGB)
PIL_image.save('Users/root/Pictures/image_RGB.jpg')

まとめ

今回の記事ではNumpyを使った簡単な画像処理の方法を解説しました。画像処理に興味がある方はぜひ参考にしてください。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト
HOSL

Author HOSL

More posts by HOSL