Pythonでの画像処理はAIへの第一歩
- システム
エンジニア - Pythonでも画像処理のようなことができるのですか。
- プロジェクト
マネージャー - もちろんできます。ライブラリを利用すれば、Pythonでは初心者でも簡単に画像処理が行えます。
画像処理とは?
画像処理とは、ある画像を例えば色で分けたリして画像を加工・処理して情報を得ることをいいます。画像処理は、特に顔認証技術で知られています。
ここではPythonでの画像処理を紹介します。ライブラリが充実しているPythonがAI向きであることがよく分かるでしょう。
Pythonでの画像処理の方法
Pythonでの画像処理には、ライブラリOpenCVがよく知られています。ここではOpenCVを初めとするPythonでの画像処理でよく利用されるライブラリのインストール方法をまず説明し、その後にPythonでの画像処理を実際に行っていきます。
使用するライブラリは、OpenCVはもちろん、NumPyやMatplotlibをインストトールして画像処理を実装します。
Jupyter notebook
Pythonのソースコードをあれこれと書きながら、その結果がすぐに分かるJupyter notebookをまずインストールします。Jupyter notebookではコンパイルの必要がないので、手間が一つ省けます。
Jupyter notebookのインストール
Python3がインストールされて、パスが通っていることを前提にします。開発環境はWindows10です。PowerShellを立ち上げて次のコマンドを打ち込めばインストールできます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
PS C:\> py -m pip install notebook Collecting notebook
Downloading notebook-6.2.0-py3-none-any.whl (9.5 MB)
|████████████████████████████████| 9.5 MB 1.1 MB/s
Collecting jupyter-client>=5.3.4
Downloading jupyter_client-6.1.11-py3-none-any.whl (108 kB)
|████████████████████████████████| 108 kB 1.1 MB/s
Collecting ipykernel
Downloading ipykernel-5.4.3-py3-none-any.whl (120 kB)
|████████████████████████████████| 120 kB 1.1 MB/s
Collecting nbconvert
Downloading nbconvert-6.0.7-py3-none-any.whl (552 kB)
|████████████████████████████████| 552 kB 726 kB/s
Collecting traitlets>=4.2.1
Downloading traitlets-5.0.5-py3-none-any.whl (100 kB)
|████████████████████████████████| 100 kB 866 kB/s
Collecting tornado>=6.1
Downloading tornado-6.1-cp39-cp39-win_amd64.whl (422 kB)
|████████████████████████████████| 422 kB 1.1 MB/s
Collecting Send2Trash>=1.5.0
Downloading Send2Trash-1.5.0-py3-none-any.whl (12 kB)
Collecting prometheus-client
Downloading prometheus_client-0.9.0-py2.py3-none-any.whl (53 kB)
|████████████████████████████████| 53 kB 658 kB/s
Collecting pyzmq>=17
Downloading pyzmq-22.0.1-cp39-cp39-win_amd64.whl (1.2 MB)
|████████████████████████████████| 1.2 MB 939 kB/s
Collecting jinja2
Downloading Jinja2-2.11.2-py2.py3-none-any.whl (125 kB)
|████████████████████████████████| 125 kB 2.2 MB/s
Collecting terminado>=0.8.3
Downloading terminado-0.9.2-py3-none-any.whl (14 kB)
Collecting ipython-genutils
Downloading ipython_genutils-0.2.0-py2.py3-none-any.whl (26 kB)
Collecting jupyter-core>=4.6.1
Downloading jupyter_core-4.7.0-py3-none-any.whl (82 kB)
|████████████████████████████████| 82 kB 410 kB/s
Collecting argon2-cffi
Downloading argon2_cffi-20.1.0-cp39-cp39-win_amd64.whl (42 kB)
|████████████████████████████████| 42 kB 322 kB/s
Collecting nbformat
Downloading nbformat-5.1.2-py3-none-any.whl (113 kB)
|████████████████████████████████| 113 kB 2.2 MB/s
Collecting python-dateutil>=2.1
Downloading python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)
|████████████████████████████████| 227 kB 2.2 MB/s
Collecting pywin32>=1.0
Downloading pywin32-300-cp39-cp39-win_amd64.whl (9.2 MB)
|████████████████████████████████| 9.2 MB 2.2 MB/s
Collecting six>=1.5
Downloading six-1.15.0-py2.py3-none-any.whl (10 kB)
Collecting pywinpty>=0.5
Downloading pywinpty-0.5.7.tar.gz (49 kB)
|████████████████████████████████| 49 kB 1.5 MB/s
Collecting cffi>=1.0.0
Downloading cffi-1.14.4-cp39-cp39-win_amd64.whl (179 kB)
|████████████████████████████████| 179 kB 2.2 MB/s
Collecting pycparser
Downloading pycparser-2.20-py2.py3-none-any.whl (112 kB)
|████████████████████████████████| 112 kB 2.2 MB/s
Collecting ipython>=5.0.0
Downloading ipython-7.19.0-py3-none-any.whl (784 kB)
|████████████████████████████████| 784 kB 2.2 MB/s
Collecting pickleshare
Downloading pickleshare-0.7.5-py2.py3-none-any.whl (6.9 kB)
Requirement already satisfied: setuptools>=18.5 in e:\programs\python\python39\lib\site-packages (from ipython>=5.0.0->ipykernel->notebook) (49.2.1)
Collecting pygments
Downloading Pygments-2.7.4-py3-none-any.whl (950 kB)
|████████████████████████████████| 950 kB 595 kB/s
Collecting decorator
Downloading decorator-4.4.2-py2.py3-none-any.whl (9.2 kB)
Collecting jedi>=0.10
Downloading jedi-0.18.0-py2.py3-none-any.whl (1.4 MB)
|████████████████████████████████| 1.4 MB 409 kB/s
Collecting backcall
Downloading backcall-0.2.0-py2.py3-none-any.whl (11 kB)
Collecting prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0
Downloading prompt_toolkit-3.0.14-py3-none-any.whl (359 kB)
|████████████████████████████████| 359 kB 2.2 MB/s
Collecting colorama
Downloading colorama-0.4.4-py2.py3-none-any.whl (16 kB)
Collecting parso<0.9.0,>=0.8.0
Downloading parso-0.8.1-py2.py3-none-any.whl (93 kB)
|████████████████████████████████| 93 kB 724 kB/s
Collecting wcwidth
Downloading wcwidth-0.2.5-py2.py3-none-any.whl (30 kB)
Collecting MarkupSafe>=0.23
Downloading MarkupSafe-1.1.1.tar.gz (19 kB)
Collecting pandocfilters>=1.4.1
Downloading pandocfilters-1.4.3.tar.gz (16 kB)
Collecting mistune<2,>=0.8.1
Downloading mistune-0.8.4-py2.py3-none-any.whl (16 kB)
Collecting defusedxml
Downloading defusedxml-0.6.0-py2.py3-none-any.whl (23 kB)
Collecting jupyterlab-pygments
Downloading jupyterlab_pygments-0.1.2-py2.py3-none-any.whl (4.6 kB)
Collecting testpath
Downloading testpath-0.4.4-py2.py3-none-any.whl (163 kB)
|████████████████████████████████| 163 kB 1.1 MB/s
Collecting bleach
Downloading bleach-3.2.3-py2.py3-none-any.whl (146 kB)
|████████████████████████████████| 146 kB 731 kB/s
Collecting nbclient<0.6.0,>=0.5.0
Downloading nbclient-0.5.1-py3-none-any.whl (65 kB)
|████████████████████████████████| 65 kB 357 kB/s
Collecting entrypoints>=0.2.2
Downloading entrypoints-0.3-py2.py3-none-any.whl (11 kB)
Collecting nest-asyncio
Downloading nest_asyncio-1.5.1-py3-none-any.whl (5.0 kB)
Collecting async-generator
Downloading async_generator-1.10-py3-none-any.whl (18 kB)
Collecting jsonschema!=2.5.0,>=2.4
Downloading jsonschema-3.2.0-py2.py3-none-any.whl (56 kB)
|████████████████████████████████| 56 kB 1.3 MB/s
Collecting pyrsistent>=0.14.0
Downloading pyrsistent-0.17.3.tar.gz (106 kB)
|████████████████████████████████| 106 kB 3.2 MB/s
Collecting attrs>=17.4.0
Downloading attrs-20.3.0-py2.py3-none-any.whl (49 kB)
|████████████████████████████████| 49 kB 578 kB/s
Collecting webencodings
Downloading webencodings-0.5.1-py2.py3-none-any.whl (11 kB)
Collecting packaging
Downloading packaging-20.8-py2.py3-none-any.whl (39 kB)
Collecting pyparsing>=2.0.2
Downloading pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)
|████████████████████████████████| 67 kB 889 kB/s
Using legacy 'setup.py install' for pywinpty, since package 'wheel' is not installed.
Using legacy 'setup.py install' for MarkupSafe, since package 'wheel' is not installed.
Using legacy 'setup.py install' for pandocfilters, since package 'wheel' is not installed.
Using legacy 'setup.py install' for pyrsistent, since package 'wheel' is not installed.
Installing collected packages: ipython-genutils, traitlets, six, pywin32, pyrsistent, attrs, wcwidth, tornado, pyzmq, python-dateutil, pyparsing, parso, jupyter-core, jsonschema, webencodings, pygments, pycparser, prompt-toolkit, pickleshare, packaging, nest-asyncio, nbformat, MarkupSafe, jupyter-client, jedi, decorator, colorama, backcall, async-generator, testpath, pywinpty, pandocfilters, nbclient, mistune, jupyterlab-pygments, jinja2, ipython, entrypoints, defusedxml, cffi, bleach, terminado, Send2Trash, prometheus-client, nbconvert, ipykernel, argon2-cffi, notebook
Running setup.py install for pyrsistent ... done
Running setup.py install for MarkupSafe ... done
Running setup.py install for pywinpty ... done
Running setup.py install for pandocfilters ... done
Successfully installed MarkupSafe-1.1.1 Send2Trash-1.5.0 argon2-cffi-20.1.0 async-generator-1.10 attrs-20.3.0 backcall-0.2.0 bleach-3.2.3 cffi-1.14.4 colorama-0.4.4 decorator-4.4.2 defusedxml-0.6.0 entrypoints-0.3 ipykernel-5.4.3 ipython-7.19.0 ipython-genutils-0.2.0 jedi-0.18.0 jinja2-2.11.2 jsonschema-3.2.0 jupyter-client-6.1.11 jupyter-core-4.7.0 jupyterlab-pygments-0.1.2 mistune-0.8.4 nbclient-0.5.1 nbconvert-6.0.7 nbformat-5.1.2 nest-asyncio-1.5.1 notebook-6.2.0 packaging-20.8 pandocfilters-1.4.3 parso-0.8.1 pickleshare-0.7.5 prometheus-client-0.9.0 prompt-toolkit-3.0.14 pycparser-2.20 pygments-2.7.4 pyparsing-2.4.7 pyrsistent-0.17.3 python-dateutil-2.8.1 pywin32-300 pywinpty-0.5.7 pyzmq-22.0.1 six-1.15.0 terminado-0.9.2 testpath-0.4.4 tornado-6.1 traitlets-5.0.5 wcwidth-0.2.5 webencodings-0.5.1
|
次のコマンドを打ち込むとJupyter notebookがブラウザで起動します。
1
|
PS C:\>jupyter notebook
|
NumPy、Matplotlib、OpenCVのインストール
これは余談ですが、ローカル環境でPythonを走らせたい人のために画像処理に必要なライブラリをインストールしておきます。NumPy、Matplotlib、OpenCVをインストールします。
次の通りにコマンドを打ち込んでください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
PS C:\> py -m pip install numpy Collecting numpy
Downloading numpy-1.19.5-cp39-cp39-win_amd64.whl (13.3 MB)
|████████████████████████████████| 13.3 MB 3.2 MB/s
Installing collected packages: numpy
Successfully installed numpy-1.19.5
PS C:\> py -m pip install matplotlib Collecting matplotlib
Downloading matplotlib-3.3.4-cp39-cp39-win_amd64.whl (8.5 MB)
|████████████████████████████████| 8.5 MB 2.2 MB/s
Requirement already satisfied: numpy>=1.15 in e:\programs\python\python39\lib\site-packages (from matplotlib) (1.19.5)
Collecting pillow>=6.2.0
Downloading Pillow-8.1.0-cp39-cp39-win_amd64.whl (2.2 MB)
|████████████████████████████████| 2.2 MB 930 kB/s
Requirement already satisfied: python-dateutil>=2.1 in e:\programs\python\python39\lib\site-packages (from matplotlib) (2.8.1)
Collecting kiwisolver>=1.0.1
Downloading kiwisolver-1.3.1-cp39-cp39-win_amd64.whl (51 kB)
|████████████████████████████████| 51 kB 192 kB/s
Collecting cycler>=0.10
Downloading cycler-0.10.0-py2.py3-none-any.whl (6.5 kB)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in e:\programs\python\python39\lib\site-packages (from matplotlib) (2.4.7)
Requirement already satisfied: six in e:\programs\python\python39\lib\site-packages (from cycler>=0.10->matplotlib) (1.15.0)
Installing collected packages: pillow, kiwisolver, cycler, matplotlib
Successfully installed cycler-0.10.0 kiwisolver-1.3.1 matplotlib-3.3.4 pillow-8.1.0
PS C:\> py -m pip install opencv-python Collecting opencv-python
Downloading opencv_python-4.5.1.48-cp39-cp39-win_amd64.whl (34.9 MB)
|████████████████████████████████| 34.9 MB 42 kB/s
Requirement already satisfied: numpy>=1.19.3 in e:\programs\python\python39\lib\site-packages (from opencv-python) (1.19.5)
Installing collected packages: opencv-python
Successfully installed opencv-python-4.5.1.48
|
画像処理
それではPythonによる画像処理を行います。ここでは公開されている画像を使ってPythonによる画像処理の一端を紹介します。
まず、次のGithubから画像をgit clone xxxxxで拾って来て下さい。
piratefsh/image-processing-101
それで始めます。
Jupyter notebookに画像をアップ
Jupyter notebookに新たにフォルダーを作り、それをrenameしてimagesにします。そこにGithubで得た画像を全てアップロードします。
次に「New」から「Python3」をクリックして、新規ノートブック「Untitled.ipynb」を作成します。
これで準備が整いました。
画像フォーマットを知る
OpenCVでは、画像はNumPy配列の3次元配列で表されます。それでは、その様子を次のソースコードで見てみましょう。
Jupyter notebookの一番下の「Untitled.ipynb」をクリックして下さい。するとコードが書き込めるページが現れます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import matplotlib, cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# read an image
img = cv2.imread('images/noguchi02.jpg')
# show image format (basically a 3-d array of pixel color info, in BGR format)
print(img)
|
このソースコードを上部の「Run」をクリックして走らせると、3次元配列が下部に表示されます。
グレースケール
次にプログラムの結果の下に、次のソースコードを書き込んで下さい。すると画像がモノクロに変わります。
1
2
3
4
5
6
7
|
# convert image to RGB color for matplotlib
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# show image with matplotlib
plt.imshow(img)
|
これで元画像が表示されます。そして、
1
2
3
4
5
6
|
# convert image to grayscale
gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
# have to convert grayscale back to RGB for plt.imshow()
plt.imshow(cv2.cvtColor(gray_img, cv2.COLOR_GRAY2RGB))
|
このソースコードをJupyter notebookで走らせるとモノクロ画像に変わります。
セグメーション
画像情報を集める際に、画像の特徴ごとに分割することで画像の振り分けができます。これをセグメーションといいます。
画像のセグメーションで一番簡単な方法は閾値処理です。或る閾値以上は白のピクセルに、未満は黒のピクセルにすれば、画像の特徴が現れます。一般的には2値画像にします。グレースケールも2値画像の一例です。
次のコードを走らせて下さい。
1
2
3
4
5
6
7
8
|
# threshold for grayscale image
_, threshold_img = cv2.threshold(gray_img, 60, 255, cv2.THRESH_BINARY)
threshold_img = cv2.cvtColor(threshold_img, cv2.COLOR_GRAY2RGB)
plt.figure(figsize=(10,10))
plt.imshow(threshold_img)
|
- システム
エンジニア - Pythonの画像処理でよく利用されるライブラリやJupyter notebookのインストールの仕方がよく分かりました。
- プロジェクト
マネージャー - 顔認証技術などAIの発展は目覚ましいものがあり、いま世界中でしのぎを削っています。Pythonの画像処理の方法を身につけて実践してみてください。
Pythonによる画像処理
この他にもまだ、Pythonの画像処理は語り尽くせないのですが、少しは参考になったでしょうか。これが発展していくと顔認証システムへと一直線です。
Pythonの画像処理に興味がある方は、色々と調べて実践してみるといいでしょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
Python新着案件New Job
-
マルチロガーソフト開発/東京都豊島区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都豊島区(池袋駅) -
マルチロガーソフト開発/東京都豊島区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都豊島区(池袋駅) -
商品化予定の振動センサーの運用保守/Python/東京都都内/【WEB面談可】
月給50万~60万円東京都都内(-駅) -
商品化予定の振動センサーの可視化UI開発のテスター/Python/東京都都内/【WEB面談可】
月給25万~35万円東京都都内(-駅) -
商品化予定の振動センサーの運用保守/Python/東京都都内/【WEB面談可】
月給50万~60万円東京都都内(-駅) -
商品化予定の振動センサーの可視化UI開発のテスター/Python/東京都都内/【WEB面談可】
月給25万~35万円東京都都内(-駅)