Pythonでの画像の畳み込み演算を現役エンジニアが解説【初心者向け】

初心者向けにPythonでの画像の畳み込み演算について現役エンジニアが解説しています。畳み込みというのは、簡単に言えば、一点の情報だけではなく周りの状況も考慮して処理を行う手法です。今回は、OpenCVというライブラリのfilter2d()関数を使って画像を平滑化し滑らかにしてみます。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

Pythonでの画像の畳み込み演算について解説します。

Pythonについてそもそもよく分からないという方は、Pythonとは何なのか解説した記事をまずご覧ください。

 

なお本記事は、TechAcademyのPythonオンライン講座の内容をもとにしています。

 

田島悠介

今回は、Pythonに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

Pythonでの画像の畳み込み演算について詳しく説明していくね!

大石ゆかり

お願いします!

この記事ではPythonでの「畳み込み演算」について学習します。

畳み込み演算は、今流行りのディープラーニングによる画像認識で頻繁に使われており、物体の向きによらずに画像を認識させたいときなどに非常に有用な手法です。

他にも、ノイズの入ったデータなどを滑らかに加工したいときなどにも用いられます。

今回は、この「畳み込み演算」のPythonでの使い方を解説します。

畳み込み(convolution)とは

Pythonによる畳み込み(convolution)のサンプル画像

畳み込みというのは、簡単に言えば、一点の情報だけではなく周りの状況も考慮して処理を行う手法である、と表現できます。

例えば、「木を見て森を見ず」という言葉があるように、一点だけを見ているとなかなか全体像が見えてきません。

一点だけではなく、全体を見ることで正しく画像を認識できたり、データを読み取ることができます。

これを数学的に表現したものが畳み込み積分と呼ばれるものです。プログラミングで実際に使う場合などは畳み込み演算と呼ばれる、よりシンプルな計算方法を用います。

計算自体はシンプルなのですが、計算量が非常に多いためコンピュータでの計算に適しています。

近年のディープラーニングの流行は、コンピュータの処理能力が昔と比べて飛躍的に上昇したことから、この畳込み演算が高速度で可能になったことが背景にあることを知っておくと良いでしょう。

Pythonでの画像の畳み込み演算。カーネル(kernel)と呼ばれる配列

畳み込み演算の具体的な計算は、上の図のようにカーネル(kernel)と呼ばれる配列を各マスごとに掛け合わせていき、最終的に新しい画像を得るというものです。

では、実際にPythonにおける畳み込み演算について解説していきます。

 

Pythonでの画像の畳み込み演算

Pythonで畳み込み演算をするには、基本的には

  1. 自分で実装する
  2. 既存のライブラリを使う

の二種類の方法があります。

Pythonのライブラリは非常に豊富で便利なものもたくさんあるので、2.既存のライブラリを使う方法が賢明でしょう。

今回は、OpenCVというライブラリのfilter2d()関数を使って畳み込み演算をしていきます。

Pythonでの画像の畳み込み演算の平滑化処理でなめらかになった画像
左がごま塩ノイズと呼ばれることのある、ノイズが入った画像です。

左側のようなノイズの入った画像を平滑化と呼ばれる処理をして右のようになめらかにすることができるのが、畳込み演算の一つの使い方です。

 

[PR] Pythonで挫折しない学習方法を動画で公開中

実際に書いてみよう

まず、行列計算に特化したライブラリであるNumpy、画像処理に特化したライブラリであるOpenCV、画像表示のためのライブラリであるmatplotlibを使うので、まずはこれらをimportします。

import numpy as np

import cv2

import matplotlib.pyplot as plt

ここでもし、

ModuleNotFoundError: No module named 'cv2'

 

と表示された場合は、コマンドライン(Windowsの場合はコマンドプロンプト、Macの場合はターミナル)で

$ pip install opencv-python

を実行してください。

次に、好きな画像を読み込みます。

今回の例では、”Lenna_gray_noise.bmp”という名前の画像を使ってコードを実行していきます。

cv2.imread()という関数を使って画像を読み込んで、一度表示します。白黒画像の場合は、第2引数を1としてください。

img =cv2.imread("Lenna_gray.bmp", 1)
plt.imshow(img)

 

画像の平滑化を行うには、カーネルと呼ばれる畳み込み演算用の行列を

kernel = np.full((3, 3), 1/9)
print(kernel)

とします。あとは、

img_2 = cv2.filter2D(img, -1, kernel)

を実行することで畳み込み演算によって平滑化した画像を得ることができます。

filter2d()関数は、カーネルに応じた畳み込み処理を簡単に行うことができる関数です。

では、実際に表示をして確認してみましょう。

plt.imshow(img2)

少しぼやけているように見えますが、画像が平滑化され、ノイズが緩和されていることが確認できると思います。

Pythonでの画像の畳み込み演算の平滑化処理でなめらかになった画像

平滑化以外にも、カーネルと呼ばれる行列の値を変更することで、様々な処理を行うことができます。

カーネルを変更してみて様々な好きな処理を行ってみると、理解が深まるると思うので、挑戦してみてください。

今回は、Pythonを使った畳み込み演算を行いました。

画像処理の分野では重要な知識なので、詳しく知りたい人はチュートリアルを参考にして学習してみると良いでしょう。

監修してくれたメンター

小倉翔悟(おぐらしょうご)

AIプログラミングを使って開発を行う大学3年生。

プログラミング歴は約3年でPythonは割と得意。好きな物理理論は一般相対性理論で動物も好き。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

 

オンラインのプログラミングスクールTechAcademyではPythonを使って機械学習の基礎を学ぶPythonオンライン講座を開催しています。

初心者向けの書籍を使って人工知能(AI)や機械学習について学ぶことができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。

また、現役エンジニアから学べる無料のプログラミング体験会も実施しているので、ぜひ参加してみてください。