OpenCV で濃淡画像を使う(イメージヒストグラム,ヒストグラム平坦化,ノイズ除去,2値化,輪郭抽出)(OpenCV,Python を使用)

1. エグゼクティブサマリー

ねらい:OpenCV を用いて,コンピュータビジョンの基本を体験し演習する.

本記事では,OpenCV と Python を使用し,濃淡画像に対する基本的な画像処理を扱う.カラー画像から濃淡画像への変換,イメージヒストグラムの表示,ヒストグラム平坦化(equalizeHist および CLAHE),ノイズの付加と除去(Non-local Means Denoising),OTSU の方法による2値化,輪郭抽出(findContours),トラッキングポイント検出(Shi-Tomasi の手法)を,fruits.jpg および home.jpg の2枚のサンプル画像を用いて実行し,結果を Matplotlib でプロットして確認する.

目次

【関連する外部ページ】

【サイト内の関連ページ】

2. 前準備(必要ソフトウェアの入手)

ここでは、最低限の事前準備について説明する。機械学習や深層学習を行う場合は、NVIDIA CUDA、Visual Studio、Cursorなどを追加でインストールすると便利である。これらについては別ページ https://www.kkaneko.jp/cc/dev/aiassist.htmlで詳しく解説しているので、必要に応じて参照してください。

Python 3.12 のインストール(Windows 上) [クリックして展開]

以下のいずれかの方法で Python 3.12 をインストールする。Python がインストール済みの場合、この手順は不要である。

方法1:winget によるインストール

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

winget install -e --id Python.Python.3.12 --scope machine --silent --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 AssociateFiles=1 InstallLauncherAllUsers=1"

--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動すると PATH が自動的に設定される。

方法2:インストーラーによるインストール

  1. Python 公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンから Windows 用インストーラーをダウンロードする。
  2. ダウンロードしたインストーラーを実行する。
  3. 初期画面の下部に表示される「Add python.exe to PATH」に必ずチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから python コマンドを実行できない。
  4. 「Install Python 3.xx for all users」にチェックを入れ、「Install」をクリックする。

インストールの確認

コマンドプロンプトで以下を実行する。

python --version

バージョン番号(例:Python 3.12.x)が表示されればインストール成功である。「'python' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。

AIエディタ Windsurf のインストール(Windows 上) [クリックして展開]

Pythonプログラムの編集・実行には、AIエディタの利用を推奨する。ここでは、Windsurfのインストールを説明する。Windsurf がインストール済みの場合、この手順は不要である。

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

winget install -e --id Codeium.Windsurf --scope machine --accept-source-agreements --accept-package-agreements --override "/VERYSILENT /NORESTART /MERGETASKS=!runcode,addtopath,associatewithfiles,!desktopicon"
powershell -Command "$env:Path=[System.Environment]::GetEnvironmentVariable('Path','Machine')+';'+[System.Environment]::GetEnvironmentVariable('Path','User'); windsurf --install-extension MS-CEINTL.vscode-language-pack-ja --force; windsurf --install-extension ms-python.python --force"

--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動すると PATH が自動的に設定される。

関連する外部ページ

Windsurf の公式ページ: https://windsurf.com/

必要なライブラリのインストール [クリックして展開]

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

python -m pip install -U opencv-python opencv-contrib-python numpy matplotlib

3. 実行のための準備とその確認手順(Windows 前提)

3.1 プログラムファイルの準備

第5章の各プログラムを実行。Windows のローカル実行の場合は「%matplotlib inline」の行は不要。

サンプル画像として fruits.jpg と home.jpg を事前にダウンロードしておく.

3.1.1 画像ファイル fruits.jpg, home.jpg のダウンロード

https://github.com/opencv/opencv/tree/master/samples/data で公開されている fruits.jpg, home.jpg を使用する(謝辞:画像の作者に感謝します)

3.2 実行コマンド

Windows の場合,コマンドプロンプトで以下を実行し,Jupyter Qt Console を起動する.

jupyter qtconsole

Jupyter Qt Console が起動したら,第5章の各コードブロックをセルに貼り付けて実行する.

3.3 動作確認チェックリスト

確認項目期待される結果
Jupyter Qt Console の起動jupyter qtconsole 実行後,ウィンドウが表示される
カラー画像から濃淡画像への変換カラー画像と濃淡画像がそれぞれプロットされる
イメージヒストグラムの表示濃淡画像と,横軸が明るさ・縦軸が画素数のヒストグラムがプロットされる
ヒストグラム平坦化(equalizeHist)平坦化前後の画像とヒストグラムがプロットされ,平坦化後の分布が均一に近づく
CLAHE によるヒストグラム平坦化CLAHE 適用前後の画像とヒストグラムがプロットされる
ノイズの付加ノイズが付加された濃淡画像がプロットされる
ノイズ除去ノイズ付加後の画像と除去後の画像がプロットされ,ノイズが軽減されている
OTSU の方法による2値化2値化画像がプロットされ,OTSU 閾値がタイトルに表示される
輪郭抽出抽出された輪郭が緑色の線でカラー画像上に描画される
トラッキングポイント検出されたトラッキングポイントが白い円で描画される

4. 概要・使い方・実行上の注意

4.1 環境別の IMROOT 設定

第5章の各コードでは,画像ファイルの格納先を変数 IMROOT で指定している.環境に応じて以下のように書き換えること.

Google Colaboratory のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="./"」のように書き換える.

4.2 カラー画像から濃淡画像への変換

cv2.cvtColor に cv2.COLOR_BGR2GRAY を指定し,BGR 形式のカラー画像を濃淡画像に変換する.Matplotlib で表示する際,カラー画像は BGR から RGB に変換して plt.imshow に渡し,濃淡画像は cmap='gray' を指定する.

4.3 イメージヒストグラム

イメージヒストグラムは,画素の明るさによるヒストグラムである.横軸が明るさ(右に行くほど明るい),縦軸が画素数を表す.

4.4 ヒストグラム平坦化 (histogram equalization)

ヒストグラム平坦化は,モノクロ画像のコントラストを改善する手法である.イメージヒストグラムが平坦化するように,画素の輝度を調整する.

4.5 CLAHE (Contrast Limited Adaptive Histogram Equalization)

CLAHE は,輪郭線が残りやすいヒストグラム平坦化の手法である.cv2.createCLAHE で clipLimit および tileGridSize を指定する.

4.6 ノイズの付加と除去

乱数で画素値をランダムに書き換えてノイズを付加する.ノイズ除去には,濃淡画像には cv2.fastNlMeansDenoising,カラー画像には cv2.fastNlMeansDenoisingColored,ビデオには cv2.fastNlMeansDenoisingMulti を使う.

4.7 OTSU の方法による2値化

2値化は,全ての画素を2値に変換する処理である.cv2.threshold に cv2.THRESH_OTSU を指定し,閾値を自動決定する.2値化画像は白と黒で表示する.

4.8 輪郭抽出

2値化の結果を利用して輪郭を抽出する.OpenCV 4 では「contours, hierarchy = cv2.findContours ...」を使う.OpenCV 3 では「image, contours, hierarchy = cv2.findContours」を使う.cv2.drawContours で輪郭を画像上に描画する.

4.9 トラッキングポイント(Shi-Tomasi の手法)

cv2.goodFeaturesToTrack で Shi-Tomasi の手法によるコーナー検出を行う.検出された点を cv2.circle で画像上に描画する.

5. ソースコード

5.1 カラー画像から濃淡画像への変換

5.1.1 fruits.jpg での実行

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)

plt.style.use('default')
plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()

5.1.2 home.jpg での実行

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "home.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
plt.style.use('default')
plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()

5.2 イメージヒストグラム

5.2.1 fruits.jpg でのヒストグラム

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
plt.style.use('default')
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()
plt.hist(mono.ravel(), 256, [0, 256])
plt.show()

ヒストグラムが表示されるので確認する.

5.2.2 home.jpg でのヒストグラム

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "home.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
plt.style.use('default')
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()
plt.hist(mono.ravel(), 256, [0, 256])
plt.show()

ヒストグラムが表示されるので確認する.

5.3 ヒストグラム平坦化 (histogram equalization)

5.3.1 fruits.jpg での平坦化(画像表示)

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
equ = cv2.equalizeHist(mono)
plt.style.use('default')
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()
plt.imshow(equ, cmap='gray')
plt.axis('off')
plt.show()

画像が表示されるので確認する.

5.3.2 fruits.jpg での平坦化(ヒストグラム表示)

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
equ = cv2.equalizeHist(mono)
plt.style.use('default')
plt.imshow(equ, cmap='gray')
plt.axis('off')
plt.show()
plt.hist(mono.ravel(), 256, [0, 256])
plt.show()
plt.hist(equ.ravel(), 256, [0, 256])
plt.show()

ヒストグラムが表示されるので確認する.

5.3.3 home.jpg での平坦化(画像表示)

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "home.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
equ = cv2.equalizeHist(mono)
plt.style.use('default')
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()
plt.imshow(equ, cmap='gray')
plt.axis('off')
plt.show()

画像が表示されるので確認する.

5.3.4 home.jpg での平坦化(ヒストグラム表示)

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "home.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
equ = cv2.equalizeHist(mono)
plt.style.use('default')
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()
plt.imshow(equ, cmap='gray')
plt.axis('off')
plt.show()
plt.hist(mono.ravel(), 256, [0, 256])
plt.show()
plt.hist(equ.ravel(), 256, [0, 256])
plt.show()

ヒストグラムが表示されるので確認する.

5.4 CLAHE によるヒストグラム平坦化

5.4.1 fruits.jpg での CLAHE(画像表示)

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
equ = clahe.apply(mono)
plt.style.use('default')
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()
plt.imshow(equ, cmap='gray')
plt.axis('off')
plt.show()

画像が表示されるので確認する.

5.4.2 fruits.jpg での CLAHE(ヒストグラム表示)

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
equ = clahe.apply(mono)
plt.style.use('default')
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()
plt.imshow(equ, cmap='gray')
plt.axis('off')
plt.show()
plt.hist(mono.ravel(), 256, [0, 256])
plt.show()
plt.hist(equ.ravel(), 256, [0, 256])
plt.show()

ヒストグラムが表示されるので確認する.

5.4.3 home.jpg での CLAHE(画像表示)

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "home.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
equ = clahe.apply(mono)
plt.style.use('default')
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()
plt.imshow(equ, cmap='gray')
plt.axis('off')
plt.show()

画像が表示されるので確認する.

5.4.4 home.jpg での CLAHE(ヒストグラム表示)

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "home.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
equ = clahe.apply(mono)
plt.style.use('default')
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()
plt.imshow(equ, cmap='gray')
plt.axis('off')
plt.show()
plt.hist(mono.ravel(), 256, [0, 256])
plt.show()
plt.hist(equ.ravel(), 256, [0, 256])
plt.show()

ヒストグラムが表示されるので確認する.

5.5 ノイズの付加

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
h, w = mono.shape
idx = np.random.randint(0, h * w, 30000)
mono.ravel()[idx] = np.random.randint(0, 255, 30000).astype(np.uint8)

plt.style.use('default')
plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()

画像が表示されるので確認する.

5.6 ノイズ除去

ここでは,一度ノイズを加えてから処理を行っている.

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
h, w = mono.shape
idx = np.random.randint(0, h * w, 30000)
mono.ravel()[idx] = np.random.randint(0, 255, 30000).astype(np.uint8)

dst = cv2.fastNlMeansDenoising(mono, None, 30, 7, 21)

plt.style.use('default')
plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()
plt.imshow(dst, cmap='gray')
plt.axis('off')
plt.show()

画像が表示されるので確認する.

5.7 OTSU の方法による2値化

5.7.1 fruits.jpg での2値化

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU)

plt.style.use('default')
plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()
plt.imshow(dst, cmap='gray')
plt.title('OTSU threshold: ' + str(r))
plt.axis('off')
plt.show()

画像が表示されるので確認する.

5.7.2 home.jpg での2値化

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "home.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU)

plt.style.use('default')
plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()
plt.imshow(dst, cmap='gray')
plt.title('OTSU threshold: ' + str(r))
plt.axis('off')
plt.show()

画像が表示されるので確認する.

5.8 輪郭抽出

5.8.1 fruits.jpg での輪郭抽出

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU)
contours, hierarchy = cv2.findContours(dst, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

plt.style.use('default')
plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()
plt.imshow(dst, cmap='gray')
plt.axis('off')
plt.show()

cv2.drawContours(bgr, contours, -1, (0, 255, 0), 3)
plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()

画像が表示されるので確認する.

5.8.2 home.jpg での輪郭抽出

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "home.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU)
contours, hierarchy = cv2.findContours(dst, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

plt.style.use('default')
plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()
plt.imshow(dst, cmap='gray')
plt.axis('off')
plt.show()

cv2.drawContours(bgr, contours, -1, (0, 255, 0), 3)
plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()

画像が表示されるので確認する.

関連する外部ページhttps://end0tknr.hateblo.jp/entry/20171105/1509845707

5.9 トラッキングポイント(Shi-Tomasi の手法)

5.9.1 fruits.jpg でのトラッキングポイント

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "fruits.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
d = cv2.goodFeaturesToTrack(mono, 80, 0.01, 5, blockSize=3)
d = np.intp(d)
for i in d:
    x, y = i.ravel()
    cv2.circle(mono, (x, y), 3, 255, -1)

plt.style.use('default')
plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()

トラッキングポイントが表示される

5.9.2 home.jpg でのトラッキングポイント

import os
import numpy as np
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

IMROOT=os.environ['LOCALAPPDATA'] + '/'
bgr = cv2.imread(IMROOT + "home.jpg")
mono = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
d = cv2.goodFeaturesToTrack(mono, 80, 0.01, 5, blockSize=3)
d = np.intp(d)
for i in d:
    x, y = i.ravel()
    cv2.circle(mono, (x, y), 3, 255, -1)

plt.style.use('default')
plt.imshow(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
plt.imshow(mono, cmap='gray')
plt.axis('off')
plt.show()

トラッキングポイントが表示される

6. まとめ

濃淡画像への変換とイメージヒストグラム

cv2.cvtColor に cv2.COLOR_BGR2GRAY を指定し,カラー画像を濃淡画像に変換する.イメージヒストグラムは画素の明るさによるヒストグラムで,横軸が明るさ,縦軸が画素数を表す.

ヒストグラム平坦化(equalizeHist と CLAHE)

ヒストグラム平坦化は,モノクロ画像のコントラストを改善する手法で,画素の輝度を調整してヒストグラムを平坦化する.CLAHE は輪郭線が残りやすい平坦化手法で,clipLimit と tileGridSize を指定して使用する.

ノイズの付加と除去

乱数で画素値を書き換えてノイズを付加する.濃淡画像のノイズ除去には cv2.fastNlMeansDenoising,カラー画像には cv2.fastNlMeansDenoisingColored を使う.

OTSU の方法による2値化

2値化は全画素を2値に変換する処理である.cv2.threshold に cv2.THRESH_OTSU を指定し,閾値を自動決定する.

輪郭抽出とトラッキングポイント

輪郭抽出は,2値化結果から cv2.findContours で輪郭を抽出し,cv2.drawContours で描画する.トラッキングポイントは cv2.goodFeaturesToTrack で Shi-Tomasi の手法によりコーナーを検出し,cv2.circle で描画する.