================
はじめに
================
.. contents:: 目次
:depth: 4
.. _about-this-document:
この資料について
================
この資料は、 `2023 年度前期開講の山口大学 工学部 知能情報工学科 3 年生向け講義「画像処理(実習を含む。)」`_ の講義資料です。
本講義では、画像処理の様々な手法について理論を学ぶと共に演習を行います。
演習では、理論を学んだ処理手法について、Python を用いて実装を行う他、
OpenCV 等、既成のライブラリも利用しつつ、実際に画像を処理してみて、どのような効果が得られるかを確認します。
.. _2023 年度前期開講の山口大学 工学部 知能情報工学科 3 年生向け講義「画像処理(実習を含む。)」:
https://www.kyoumu.jimu.yamaguchi-u.ac.jp/Portal/Public/Syllabus/SyllabusSearchStart.aspx?lct_year=2023&lct_cd=1062530570&je_cd=1
教科書としては、以下の書籍を用います。
* ディジタル画像処理 [改訂第二版]
* 2020-03-10 発行
* 公益財団法人画像情報教育振興協会(CG-ARTS協会)
* ISBN: 978-4-903474-64-9
* 単行本: 4,290円
* Kindle版(電子書籍): 3,861円
* iBook版(電子書籍): 3,800円
* https://www.cgarts.or.jp/book/img_engineer/
紙の単行本の他に、若干安価で置き場所にも困らない電子書籍版もあります。
詳細はサポートページで確認してください。
電子版は DRM フリーの PDF 等で提供され方が嬉しいですが、
残念ながら探した範囲では同書籍には DRM フリーの形態による提供は見つかりませんでした。
見つけた方は、情報提供してもらえると有難いです。
.. _target-environment:
想定している環境について
========================
本資料は演習用の環境として Windows 10 または 11 上の
`WSL `_ に導入した
:term:`Ubuntu` を想定しています。
この環境上に
:term:`Python` version 3 を導入し、
:term:`matplotlib`、
:term:`Project Jupyter` の JupyterLab または Jupyter Notebook、
:term:`OpenCV` 等のライブラリを利用して演習を行います。
ベアメタルか、Hyper-V、VMWare、VirtualBox 等の仮想環境に Ubuntu を導入してもらえば、
Windows 以外の Ubuntu 上での作業の部分はそのまま適用可能なはずです。
一応 `POSIX (Portable Operating System Interface) `_ 準拠の環境で
shell として bash を用いることを前提に考えてはいるので、
Cygwin や macOS、Linux系 または BSD 系をはじめとする UNIX 系の OS であれば
大半の説明はそのまま適用可能なはずです。
ただし、パッケージの管理システムが Ubuntu とは異なるので、各種ソフトの導入手順等は個別に調整してもらう必要があります。
また、同じ POSIX でも Linux 系の多くで採用されている GNU 系のコマンドと
macOS や BSD 系で採用されている BSD 系のコマンドでは各コマンドが備えるのオプションに差異があるため、
それらについても細かい部分で調整が必要かもしれません。
Windows 用の Python 3 には
`Python 公式の win32 版 `_、
`Python 公式の Microsoft Store 版 `_、
`Anaconda 同梱版 `_ 等の Windows ネイティブ版もあります。
POSIX 不要で Python 3 のみで完結する話は、これらの環境でも代替できるはずです。
しかし、いずれにしても、個別の環境の全てについて動作確認までは行っていませんので上手く行かない場合は相談してください。
.. _Supplementary-about-explanation-and-notation-of-operation:
操作の説明や表記に関する補足
============================
以降の話では、OS (Operating Sysmtem) 上で行う各種操作の指示があります。
Windows 向けの操作の指示で「スタート」「設定」等を起点として説明が行われている場合、
「スタート」はデスクトップ左下の Windows ロゴのアイコン(田) [#WindowsLogo]_ で示される
「スタート」ボタンを意味します。
「設定」はデスクトップの「スタート」ボタンから開いたスタートメニューや、
Windows 10 ではデスクトップ右下の吹き出しのアイコン(💬)から開いた通知領域、
Windows 11 ではデスクトップ右下のネットワークとスピーカーと電源のアイコンから開いたクイック設定のポップアップウインドウに、
歯車のアイコン(⚙)で表示される「設定」ボタンを意味します。
キーボードからの操作では [SHIFT] や [ENTER] のように
[...] で囲まれた表記は :kbd:`SHIFT` キーや :kbd:`ENTER` キーを意味します。
:kbd:`SHIFT` キーを押したまま :kbd:`ENTER` キーを叩くような動作の場合は [SHIFT]+[ENTER]、
:kbd:`SHIFT` キーと :kbd:`CTRL` キーを押したまま :kbd:`ENTER` キーを叩くような動作の場合は [SHIFT]+[CTRL]+[ENTER]
のように表記します。
[田 (Windows Logo Key)] のような指示も出てきますが、これは Windows を搭載している PC のキーボード左下にある Windows ロゴの入ったキーです。
.. |WindowsLogo| image:: ./WinLogo.svg
:alt: Windows Logo
.. [#WindowsLogo] ここでは便宜上「田」と表記していますが、最近の PC では |WindowsLogo| のようなアイコンとなっている場合が多いでしょう。
.. _about-CLI:
CLI について
==============
デスクトップ型やノート型のパーソナルコンピュータをはじめとして、スマートフォンやタブレット等、
今日における大多数のコンピュータの操作方法、つまり `UI (User Interface: ユーザーインターフェース)`_ は、
`GUI (Graphical User Interface: グラフィカルユーザーインターフェース)`_ が主流となっています。
これは、マウスやタッチパネル等のポインティングデバイスを用いてボタンやメニュー等を解して命令することで
コンピュータを操作する方法です。
対して、
`CLI (Command Line Interface: コマンドラインインターフェース)`_ は、
コマンドライン、つまりはキーボード等から入力される文字情報によりコンピュータを操作する UI (User Interface: ユーザーインターフェス)です。
CUI (Character User Interface: キャラクターユーザーインターフェース)とも呼ばれます。
CLI は GUI の登場以前から使われて来た伝統的かつ古風な UI です。
しかし現在でも、処理を反復したい場合や自動化したい場合等、GUI よりも利便性が高いケースは枚挙に暇がありません。
本資料でも、演習環境の構築等の手順は可能な限り CLI へコマンドを貼り付ける方式を取っています。
通常 CLI は、
`command line interpreter (コマンドラインインタプリタ)`_ と、
`terminal emulator (ターミナル エミュレータ、または端末エミュレータ)`_ の二つで構成されます。
Command line interpreter は入力された命令をその場で解釈して実行するプログラムです。
`interactive shell (インタラクティブシェル)`_ とか
`command line shell (コマンドラインシェル)`_
または単純に `shell (シェル)`_ と呼ばれることもあります。
Terminal emulator は command line interpreter と人間の仲立ちをするプログラムです。
キーボード等からの入力されてた命令を command line interpreter に伝え、
命令の実行結果である文字列の情報を画面上に表示することで人間に伝えます。
.. _`UI (User Interface: ユーザーインターフェース)`: https://google.com/search?q=%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%82%B9
.. _`GUI (Graphical User Interface: グラフィカルユーザーインターフェース)`: https://google.com/search?q=%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%82%AB%E3%83%AB%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9
.. _`CLI (Command Line Interface: コマンドラインインターフェース)`: https://google.com/search?q=%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9
.. _command line interpreter (コマンドラインインタプリタ): https://google.com/search?q=%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF
.. _terminal emulator (ターミナル エミュレータ、または端末エミュレータ): https://google.com/search?q=%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC
.. _interactive shell (インタラクティブシェル): https://google.com/search?q=%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%B7%E3%82%A7%E3%83%AB
.. _command line shell (コマンドラインシェル): https://google.com/search?q=%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%B7%E3%82%A7%E3%83%AB
.. _shell (シェル): https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%AB
.. _CLI-in-Windows:
Windows の CLI
===============
2023年5月現在の現行版 Windows である Windows 10 及び 11 に標準搭載されている CLI は
shell と terminal emulator それぞれに新旧 2 種類ずつ用意されています
古い方の shell は `cmd.exe`_ (コマンド プロンプト) です。
元々は、Windows 以前の MS-DOS の時代から、その GUI ラッパーとして実装されていた初期の Windows にかけて使われていた
`COMMAND.COM`_ という shell がありました。
これを、現在の Windows の祖先である Windows NT 用に書き直して機能強化したものが cmd.exe です。
機能強化されたと言っても、MS-DOS 時代の名残を強く引きずっているため、近代的な shell に比べると著しく使い勝手が劣ります。
新しい方の shell は powershell.exe (Windows `PowerShell`_) です。
Windows XP の時代に開発され、Windows 7 では version 2 が標準搭載されるようになりました。
Windows 10 や 11 には version 5 が標準搭載されています。
これは、入出力がオブジェクトとなっていたり、COM オブジェクトを解したプロセス間通信が出来る等、
UNIX 系の OS で主流の bash、tcsh、zsh 等と比べてもかなり近代的で野心的な作りになっています。
2016 年発表された version 6 は OSS (Open Source Software) 化されたことで、
マルチプラットフォーム対応となり、Linux をはじめとした様々な OS でも利用可能となりました。
ただし、標準搭載ではないことに加えて、コマンド名も pwsh.exe に変更されています。
文法等にもかなりの機能強化が施されているようなので、上位互換の別言語的な位置付け、
例えるなら C 言語に対する C++ のような関係と考えておいた方が良いかもしれません。
.. _cmd.exe: https://ja.wikipedia.org/wiki/Cmd.exe
.. _COMMAND.COM: https://ja.wikipedia.org/wiki/COMMAND.COM
.. _PowerShell: https://ja.wikipedia.org/wiki/PowerShell
Terminal emulator は、従来から Windows の OS に内蔵されていた物は `console (コンソール)`_ と呼ばれています。
cmd.exe や powershell.exe を実行した時に表示されるウインドウがそれです。
Windows Vista までは完全に OS 内蔵のコンソール機能の扱いになっていて、実行ファイルが分離された形にはなっていませんでした。
Windows 7 になってからは conhost.exe に分離されています。
Windows 10 になると version 1809 で機能強化が行われた際に
UNIX の `pty`_ (Pseudo tty, Pseudo teleetypewriter, Pseudo terminal: 疑似端末) ライクな
`Pseudo Console (ConPTY)`_ が実装されました。
それと同時に、新たな terminal emulator として `Windows Terminal`_ がリリースされました。
Windows 10 では少なくとも 21H2 の段階ではオプション扱いになっており、winget か Microsoft Store から別途導入する必要がありますが、
Windows 11 では標準搭載されています。
.. _console (コンソール): https://docs.microsoft.com/ja-jp/windows/console/consoles
.. _pty: https://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC%E7%AB%AF%E6%9C%AB
.. _Pseudo Console (ConPTY): https://devblogs.microsoft.com/commandline/windows-command-line-introducing-the-windows-pseudo-console-conpty/
.. _Windows Terminal: https://www.microsoft.com/store/productId/9N0DX20HK701
本資料では、主に POSIX 環境を想定していますが、POSIX 環境の構築には cmd.exe や powershell.exe 等 Windows 独自の shell を用いた作業が必要となります。
また POSIX 環境の CLI を使う際は、conhost.exe や Windows Terminal 等 Windows 用の terminal emulator を介して bash 等の POSIX 用 shell を利用することになります。
.. _HowTo-start-PowerShell:
PowerShell の起動方法
----------------------
PowerShell を開くには以下の手順を推奨します。
#. キーボードから [田 (Windows Logo Key)]+[R] を叩き「ファイルを指定して実行」ダイアログを開く。
#. 「名前」の欄に ``powershell`` と入力し(:numref:`powershell コマンド`、:numref:`ファイル名を指定して実行_powershell`) [ENTER] キーを叩く。
以上で、Windows PowerShell のウインドウが開きます(:numref:`WindowsPowerShell`)。
.. code-block:: text
:class: forCnP
:caption: powershell コマンド
:name: powershell コマンド
powershell
.. figure:: fig_run_powershell.png
:name: ファイル名を指定して実行_powershell
「ファイル名を指定して実行」ダイアログから Windows PowerShell を起動する。
.. figure:: fig_WindowsPowerShell.png
:name: WindowsPowerShell
通常のユーザー権限で実行した Windows PowerShell。
上記の手順の最後で [ENTER] を叩く代わりに [SHIFT]+[CTRL]+[ENTER] を叩くと、
管理者権限で Windows PowerShell を実行することができます。
管理者権限で実行する際は「ユーザー アカウント制御」 [#UAC]_ のダイアログが表示され、
「このアプリがデバイスに変更を加えることを許可しますか?」と聞かれます (:numref:`UAC Dialog`) 。
これを許可すると、管理者権限で Windows PowerShell が開きます。
.. figure:: fig_UAC.png
:name: UAC Dialog
「ユーザー アカウント制御」のダイアログ
.. [#UAC] 「ユーザー アカウント制御」のダイアログは、単純に UAC (User Account Control) と呼ばれることもあります。
UAC で許可を行うとアプリケーションソフトウェアに対して管理者権限が与えられるため、OS の保護機能により通常は変更不能な設定も変更可能となります。
つまり、自分が意図していないアプリに許可を出すとデバイスを乗っ取られる可能性があります。
安全と分かっているアプリ以外に対して、決して許可を出してはいけません。
UAC が表示された場合は不用意に許可を出さないよう十分に注意してください。
今回の場合は、自分で意図して管理者権限で実行しようとしているので、許可して問題ありません。
「はい」を選択して許可を与えてください。
管理者権限の PowerShell が開いたら、
ウインドウ左上のタイトルバーに「管理者: Windows PowerShell」と表示されているはずです(:numref:`管理者-WindowsPowerShell`)。
単に「Windows PowerShell」とだけ表示されている場合(:numref:`WindowsPowerShell`)は、管理者権限が付いていませんので、
もう一度、上記の手順の最後で [ENTER] の代わりに [SHIFT]+[CTRL]+[ENTER] を叩くことで管理者権限の Windows PowerShell を開き直してください。
.. figure:: fig_admin-WindowsPowerShell.png
:name: 管理者-WindowsPowerShell
管理者権限で実行した Windows PowerShell。
管理者権限が必要な場面で、一般ユーザー権限で実行していると、必要な設定が出来ませんので注意してください。
PowerShell は、「スタート」メニューから「PowerShell」を見つけて実行することも出来ます。
管理者権限で実行したい場合は、「PowerShell」を右クリックしてメニュを開き「管理者として実行」を選択して実行するか、
[SHIFT]+[CTRL]+[ENTER] を叩いて実行してください。
Web ブラウザなどからコピーしたコマンドを、PowerShell へ貼り付けて実行したい場合は、マウスの右ボタンをクリックしください。
キーボードから [SHIFT]+[INTERT] キーを叩く方法でも貼り付けを行う事が出来ます。
.. _about-POSIX-environment:
POSIX 環境について
====================
本資料では演習環境としては `POSIX (Portable Operating System Interface) `_ 環境を想定しています。
POSIX とは UNIX 系の OS が備えるべきコマンドや API 等の標準的なインターフェースを定めた規格です。
.. _POSIX-environment-on-Windows:
Windows の POSIX 環境
------------------------
Windows 11 上で POSIX 環境を使うには、
`WSL `_ の 1 または 2 や
`Cygwin `_ 等いくつかの方法があります。
WSL は Windows 上で Linux のバイナリ(= 実行形式のファイル)を直接実行させるための
サブシステムで、Windows Subsystem for Linux の略称です。
WSL1 は Linux と呼ばれる OS の中心核である kernel の互換レイヤーを Windows 上に実装することで、
Linux の実行形式のファイル(通常、バイナリと呼ばれる)を高い互換性を持って直接実行可能にしています。
WSL1 は Windows 10 1607 以降で利用可能です。
WSL2 は Windows の備える Hyper-V と呼ばれる仮想化機能と修正版の Linux kernel を用いることで、
Linux のバイナリを直接実行可能にしています。
Windows 上で本物の Linux kernel を動作させることで WSL1 よりも高い互換性を実現しています。
WSL2 は Windows 10 2004 以降で利用可能です。
Linux は本来 OS の核である kernel を指しますが、kernel だけでは OS として機能しません。
Kernel に加えて各種デーモンなどで構成されるサービス群や、shell を始めとした各種コマンドで構成されるユーザーランド等、
OS として必要な機能をひとまとめにした配布物を Linux Distribution (略称で distro)と呼んでいます。
distro は無数に存在しますが代表的なものとしては、
:term:`Arch`、
:term:`Debian`、
:term:`Gentoo`、
:term:`Kali`、
:term:`Oracle`、
:term:`RedHat`、
:term:`Slackware`、
:term:`SUSE`、
:term:`Ubuntu` 等があります。
WSL では標準的には Ubuntu が導入されますが、Debian や Kali、Oracle、SUSE 等も選択可能です。
Cygwin は POSIX 互換の API レイヤーやコマンド群を Windows 上に用意することにより、
POSIX 向けのソースコードを最小限の修正でビルド可能にした環境です。
WSL のように Linux バイナリを直接実行することは出来ませんが、
ソースコードがコンパイル出来れば、POSIX 向けのソフトをそのまま動かすことができます。
基本的には WSL2 上に導入した Ubuntu を推奨します。
WSL1 や Cygwin でも問題はありませんが、利用者による工夫や努力が必要になる度合いは増えるでしょう。
他にも MinGW/MSYS2 等がありますが、実質的に Cygwin のサブセットなので、推奨はしません。
.. _POSIX-environment-on-mac:
mac の POSIX 環境
-------------------
macOS については、生憎と手元に実機サンプルがありませんので各自で対応してもらう他ありませんが、
macOS は UNIX 認証を受けているため POSIX 準拠であり、標準搭載のターミナルからほぼ同様の作業は可能なはずです。
ただし、Linux の多くではコマンド体系が GNU 系なのに対して、macOS はコマンド体系が BSD 系であることに加えて、
標準の shell が bash ではなく zsh なので、細かな違いに起因する調整は必要になると思います。
.. _POSIX-environment-on-Chromebook:
Chromebook の POSIX 環境
--------------------------
Chromebook の場合は、設定画面から `Linux 開発環境 `_ を有効にすることで、Debian を利用可能です。
Ubuntu は Debian をベースに作られているので、Ubuntu とは、かなりの部分で共通性があります。
.. _about-Python:
Python について
=================
:term:`Python` はインタプリタ型のプログラミング言語です。
昨今の人工知能ブームでは機械学習関連用途で事実上の業界標準(デファクトスタンダード)の地位を確立しています。
以下にいくつか特徴的な点を挙げます。
* 事前にコンパイルが不要で、いわゆる `スクリプト言語 (scripting language)`_ や `軽量プログラミング言語 (LL: Lightweight Language)`_ にカテゴライズされる
* ブロックをインデントで表現する。
* このため、他の言語に比べてソースコードのインデント様式に統一感がある
* クラスベースのオブジェクト指向型プログラミングをサポート
* モジュール機構により豊富なライブラリを利用可能
* アプリケーションソフトに組み込むことでマクロ言語的な利用も可能(例: Blender, GIMP 等)
.. _`スクリプト言語 (scripting language)`: https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E8%A8%80%E8%AA%9E
.. _`軽量プログラミング言語 (LL: Lightweight Language)`: https://ja.wikipedia.org/wiki/%E8%BB%BD%E9%87%8F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E
Python3 系列は Python2 系列に対する後方互換性が十分ではなかったため、長らく Python2 系列が使われてきましたが、
2020-01-01 に Python2 系列の最終バージョンである 2.7 のサポート終了を迎えたことで、
現在は Python3 系列がメインで使われています。
ただし、POSIX 環境で python コマンドを使うと、未だに python2 が呼び出されるケースがあるので、
明示的に python3 コマンドを使うか事前にバージョン確認を行わないと、
知らない間に python2 を使っていて時間を無駄にすることがあるかも知れません。
.. _about-Jypyter-Notebook:
Jupyter Notebook について
===========================
Jupyter Notebook は :term:`Project Jupyter` により python を用いて製作された対話型実行環境であり、web ブラウザ上から操作します。
Python 以外にも R や Julia を始めとした様々なプログラミング言語を対話実行可能で、機能強化された上位互換の後継製品として JupyterLab もあります。
Google によるクラウドサービス :term:`Google Colaboratory` も Jupyter Notebook がベースとなっており、
インストール不要で web ブラウザ上から手軽に python を利用出来るだけでなく、
必要とあれば `Google Colab Pro、Pro+`_ で課金することにより強力な演算能力をも手にできる環境として人気を博しています。
.. _Google Colab Pro、Pro+: https://colab.research.google.com/signup/pricing?utm_source=dialog&utm_medium=link&utm_campaign=settings_page
.. _about-OpenCV:
OpenCV について
==================
:term:`OpenCV (Open Source Computer Vision Library)` は
Intel により開発され OSS (Open Source Software) として公開されたコンピュータビジョン向けの画像処理ライブラリです。
多種多様なアルゴリズムが実装されており、画像処理が必要な様々な場面で高度な処理を手軽に利用可能な定番ライブラリの一つとなっています。
C/C++、Java、Python の他にも、最近では JavaScript からも利用出来たり、その他様々な言語用のラッパーも公開されています。