OpenCVは、インテルのエンジニアが開発した無料配布されている画像処理/画像解析のライブラリです。
- OpenCVの基本的な使い方を知りたい人
- OpenCVの便利なメソッドを使いたい人
- OpenCVよる具体的な手法(画像認識/処理など)を知りたい人
上記の悩みを解決しながら、OpenCVのインストールから使い方まで解説します。
また、OpenCVの具体的な手法で画像認識や画像処理などに関する解説を記載しています。
OpenCVとは
PythonにおけるOpenCV(Open Source Computer Vision Library)は、画像処理や検出機能を豊富に提供するライブラリです。
画像の読み書き/フィルタ処理/物体検出/機械学習との連携などが行えます。
また、NumPyと組み合わせて使うことで効率的な画像配列処理が可能です。
多くのチュートリアルやサンプルが存在し、初心者から研究開発まで利用されています。
OpenCVができること
以下は、OpenCVによる代表的な特徴(できること)になります。
- 画像保存(入出力)
- 画像認識(表示)
- 画像処理
- 画像検出(抽出)
- 機械学習(ディープラーニングなど)
特に、顔検出(物体検知)/文字認識/画像のパターンマッチングなどがありますが、これらを実現するライブラリとして活用されます。
画像保存(入出力)
カメラやUSBからの画像を取り込んだり、処理後の画像をPC画面や別ファイルとして出力するコマンドが用意されています。
- BMP, JPEG, PNG, PBMなど主要なフォーマットに対応
- 解像度/フレームレート/その他設定の確認・変更もコマンドで実行可能
画像認識(表示)
OpenCVでは、データの取得元(動画や静止画)によって使用するメソッドが異なります。
以下に動画と静止画によって使用するメソッドをまとめます。
メソッド | 説明 |
---|---|
cv2.VideoCapture() | 動画ファイルまたはカメラデバイスを開く(例:cv2.VideoCapture(0)) |
.read() | 開いた動画またはカメラから1フレーム(画像)を取得する |
cv2.imread() | 画像ファイル(JPG, PNG など)を読み込み、NumPy配列として返す |
cv2.VideoCapture() + .read()
cap = cv2.VideoCapture("video.mp4") # または 0(カメラ)
ret, frame = cap.read()
cv2.imread()
img = cv2.imread("image.jpg")
取得元 | 使用メソッド |
---|---|
カメラ/動画 | cv2.VideoCapture() + .read() |
静止画 | cv2.imread() |
上記のように、動画や静止画データによる読み込み方法で混同しないよう注意しましょう。
画像処理
OpenCVでは、オブジェクト検出の精度向上や高速化などといった画像の前処理におけるコマンドが用意されています。
以下は、代表的な画像処理になります。
- グレースケール化
- 2値化
- エッジの抽出
- リサイズ
- 反転
- 色変換
- フィルター処理
例えば、事前にカラーで取得した画像をグレースケール化して情報量を少なくするなどの工夫を実施できます。

グレースケール化

import cv2
# 画像の読み込み
img = cv2.imread("image.jpeg")
# ① グレースケール化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite("gray_image.jpeg", gray)
2値化

import cv2
# 画像の読み込み
img = cv2.imread("image.jpeg")
# ② 2値化(閾値=127)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv2.imwrite("binary_image.jpeg", binary)
エッジの抽出

import cv2
# 画像の読み込み
img = cv2.imread("image.jpeg")
# ③ エッジの抽出(Canny法)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
cv2.imwrite("edges_image.jpeg", edges)
リサイズ

import cv2
# 画像の読み込み
img = cv2.imread("image.jpeg")
# ④ リサイズ(幅400×高さ400)
resized = cv2.resize(img, (400, 400))
cv2.imwrite("resized_image.jpeg", resized)
反転

import cv2
# 画像の読み込み
img = cv2.imread("image.jpeg")
# ⑤ 反転(上下・左右)
# 左右反転
flipped_lr = cv2.flip(img, 1)
cv2.imwrite("flipped_lr.jpeg", flipped_lr)
# 上下反転
flipped_ud = cv2.flip(img, 0)
cv2.imwrite("flipped_ud.jpeg", flipped_ud)
色変換

import cv2
# 画像の読み込み
img = cv2.imread("image.jpeg")
# ⑥ 色変換(BGR → HSV)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imwrite("hsv_image.jpeg", hsv)
フィルター処理

import cv2
# 画像の読み込み
img = cv2.imread("image.jpeg")
# ⑦ フィルター処理(ぼかし処理)
blurred = cv2.GaussianBlur(img, (15, 15), 0)
cv2.imwrite("blurred_image.jpeg", blurred)
画像検出(抽出)
OpenCVでは、ある条件に合致したオブジェクトを検出するコマンドが用意されています。
以下は、代表的な検出条件になります。
- 物体検出(位置/リアルタイムなど)
- エッジ検出
- QRコード検出
- コーナー検出
- 形状検出(文字/枠/ボールなど)
- 人物検出(骨格/顔/目/輪郭/手など)
- 円検出
- 図形検出(楕円/円/曲線/直線/矩形など)
- 境界検出
- 色検出
- その他の特徴点検出
検出した結果をどのように使うかといった場面が多いですが、検出するまでを1つのコマンドで実行できるのは便利です。
例えば、顔検出におけるコマンドを実行すると座標/幅高さなどの数値データとして得られ、画像加工することで検出システムなどに利用できます。
顔検出プログラム

import cv2
# 画像読み込み
img = cv2.imread("image-2.jpeg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Haar Cascade分類器の読み込み(OpenCV付属)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
# 顔検出(scaleFactor=1.1, minNeighbors=5は一般的な設定)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
# 検出結果の表示
print(f"検出された顔の数: {len(faces)}")
for i, (x, y, w, h) in enumerate(faces):
print(f"顔{i+1}: X={x}, Y={y}, 幅={w}, 高さ={h}")
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2) # 赤色の四角
# 結果の保存
cv2.imwrite("face_detected_image.jpeg", img)
検出された顔の数: 2
顔1: X=162, Y=98, 幅=45, 高さ=45
顔2: X=395, Y=108, 幅=47, 高さ=47
機械学習(ディープラーニングなど)
機械学習は、コンピュータがデータからパターンを学び自動で判断や予測を行う技術です。
明示的にプログラムされなくても、経験(データ)を通じて性能が向上します。
主な手法には教師あり学習/教師なし学習/強化学習、そしてディープラーニングがあります。
OpenCVは主に画像処理ライブラリですが、一部の機械学習機能(特に古典的な分類器や物体検出)も提供しています。
メソッド/ツール名 | 説明 |
---|---|
opencv_createsamples | ポジティブ画像を使って、訓練用のサンプル(正解データ)を生成するツール。 背景との合成も可能。 |
opencv_traincascade | ポジティブ/ネガティブサンプルを用いて、HaarやLBPの特徴量を使ったカスケード分類器を学習。 |
cv::CascadeClassifier::train() | C++ APIで、Haar/LBPカスケード分類器を学習(内部的にtraincascadeと同等)。 |
cv::ml::SVM::train() | サポートベクターマシン(SVM)を学習させるメソッド(OpenCVのmlモジュール内)。 |
cv::ml::KNearest::train() | K近傍法(KNN)の分類器を学習させるメソッド。 |
cv::ml::DTrees::train() | 決定木の学習用メソッド。分類や回帰に使用可能。 |
cv::ml::TrainData::create() | 機械学習モデルに供給するトレーニングデータセットを構築するためのユーティリティ。 |
OpenCVのメリット・デメリット
OpenCVを扱う上でメリット・デメリットが挙げられます。
- 画像処理の前処理全般(フィルタ処理、輪郭抽出など)
- リアルタイム映像処理(Webカメラや動画からの処理)
- 顔検出や物体検出(軽量なモデル使用時)
- シンプルな画像分類・特徴抽出
- 画像や動画の変換・保存・読み込み
- 幾何変換・射影変換(画像のゆがみ補正など)
- 簡単な物体追跡(Tracking)
- 画像中の文字検出(OCR前の補助処理)
- ステレオ画像からの距離推定(Stereo Vision)
- プロトタイプや教育用途での画像認識入門
OpenCVは強力な画像処理ライブラリですが、用途や目的によっては不向きな点も存在します。
- ディープラーニングとの統合が不完全
- ドキュメントが不十分または古いことがある
- 初学者にとってAPIが難解
- 高速だが最適化には限界がある
- GUI機能は簡易的で制限が多い
- 3D処理や点群処理が弱い
- マルチスレッド/非同期処理が難しい
- モデルサイズやメモリ効率が悪いことがある
- モバイル・組み込みでの実行には最適化が必要
- 最新の研究成果に追いついていない
そのため、以下の実施対象にOpenCVの活用をおすすめします。
- 教育・研究用途(基礎画像処理の理解に)
- ロボット・組み込み系のビジョン処理(軽量で高速)
- Webカメラでの顔検出・ジェスチャー認識など
- 非AIベースの画像解析処理(工場検査/QRコード読み取りなど)
OpenCVのサポートプログラミング言語
OpenCVを使用できる言語は、バージョンによって異なりますが公式にサポートされているのは以下の言語になります。
プログラミング言語 | V2.x | V3.x | V4.x |
---|---|---|---|
Python | |||
C++ | |||
Java | |||
C |
OpenCVのインストール
OpenCVを利用するためには、ローカルPC上にインストールする必要があります。
以下は、OpenCVのインストール方法になります。
また、全く環境構築ができていない場合を考え、以下の構築ステップを記載します。
Pythonの公式サイトからインストーラーをダウンロードします。
各OSに合わせたインストーラーを起動することでPythonを自身のPCにインストールできます。
Pythonの詳細なインストール手順や設定を画像で知りたい人は「【Python】ダウンロードとインストール方法から開発環境構築まで解説!」を一読ください。
MacOS/Windowsともに記載してあるため、インストール方法で迷った際にお読みください。

基本的に、Pythonをインストールした時点で付属モジュールとしてpipもインストールしています。
pipモジュールを利用することでOpenCVのインストールが可能になります。
pip --version
上記のコードにて、pipモジュールのバージョンを確認できます。
OpenCVをインストールする場合は、以下のコマンドをターミナルあるいはコマンドプロンプトで実行します。
Pythonパッケージ管理ツールpipを利用することでインストールできます。
pip install opencv-python
Jupyter Notebookをお使いの方は、起動したNotebookのセルに、先頭に!マークをつけて実行することでインストールすることが出来ます。
!pip install opencv-python
また、データ分析環境でよく利用されるJupyter NotebookあるいはJupyter Labの記事も一読ください。


オンライン環境でPythonを扱いたい人は「【Python】Google Colaboratoryとは?料金から使い方まで網羅的に解説!」を一読ください。

OpenCVの基本的な使い方
ここでは、OpenCVの基本的な使い方として代表的な操作を解説します。
以下は、OpenCVの代表的な操作になります。
- 画像の入出力/表示
- 図形描画/アノテーション
- 色変換/チャンネル操作
- エッジ&輪郭検出
- フィルタ処理
- モルフォロジー
- 二値化/しきい値処理
- 幾何変換/補正
- 特徴点/テンプレートマッチング
- 直線/円検出(ハフ変換)
- ピクセル操作/数理演算
- 画像分割/その他高度処理
OpenCVには約50種以上の画像処理・描画・変換・解析メソッドが豊富に揃っています。
用途に応じて「入力→処理→出力」のパイプラインを柔軟に構築できるため、プロトタイプ開発/リアルタイム処理/教育利用に向いています。
画像の入出力/表示
OpenCVでは、cv2.imread()で画像を読み込み、cv2.imshow()で表示ができます。
cv2.imwrite()を使えば、加工後の画像を保存可能です。
また、cv2.VideoCapture()でカメラや動画ファイルからのフレーム取得も可能です。
表示にはcv2.waitKey()とcv2.destroyAllWindows()を併用します。
メソッド名 | 説明 |
---|---|
imread | 画像ファイルの読み込み |
imwrite(=画像保存) | 画像をファイルに保存 |
imshow | 画像表示ウィンドウの表示 |
waitKey | キー入力待ち(表示制御) |
VideoCapture | ビデオ・カメラ映像の取得 |
VideoWriter | 動画ファイルへの書き出し |
imread
OpenCVで画像ファイル(JPEG, PNGなど)を読み込む際に使用します。
カラー、グレースケール、透明度などの読み込み形式を指定できます。
戻り値はNumPy配列として画像が格納されます。
引数名 | 説明 |
---|---|
filename | 読み込む画像ファイルのパス |
flags | 読み込み形式(cv2.IMREAD_COLOR 等) |
import cv2
# カラーで画像を読み込む
img = cv2.imread("image.jpg", cv2.IMREAD_COLOR)
imwrite
画像データ(NumPy配列)をファイルに保存するために使用します。
JPEG, PNG, BMPなどのフォーマットで保存できます。
保存成功時はTrue、失敗時はFalseが返されます。
引数名 | 説明 |
---|---|
filename | 保存する画像ファイルのパス |
img | 保存対象となる画像データ(配列) |
import cv2
# 読み込んだ画像をPNG形式で保存
cv2.imwrite("saved_image.png", img)
imshow
画像をウィンドウに表示します(GUIベースでの確認用)。
cv2.waitKey()と組み合わせて使用する必要があります。
ノートブック環境では動作しない場合があります。
引数名 | 説明 |
---|---|
winname | 表示ウィンドウの名前(文字列) |
mat | 表示する画像データ(配列) |
import cv2
# "Image"という名前で画像を表示
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
waitKey
imshowで表示したウィンドウを維持し、キー入力を待ちます。
指定ミリ秒待機後にウィンドウが自動的に閉じるか、キーイベントを取得できます。
0を指定すると無限に待機します。
引数名 | 説明 |
---|---|
delay | 待機時間(ミリ秒)。0なら無限待機 |
import cv2
# 画像を表示して、何かキーが押されるまで待つ
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
VideoCapture
動画ファイルまたはWebカメラからフレームを取得するためのクラスです。
キャプチャ後、read()メソッドで1フレームずつ取得可能です。
番号(0や1)は接続カメラのID、または動画ファイルのパスを指定します。
引数名 | 説明 |
---|---|
source | カメラ番号または動画ファイルパス |
import cv2
# カメラ(デバイス0)から映像を取得
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
cv2.imshow("Frame", frame)
cv2.waitKey(0)
cap.release()
cv2.destroyAllWindows()
VideoWriter
複数の画像フレームを連結して動画として保存するために使用します。
コーデック、フレームレート、サイズを指定して初期化します。
write()メソッドで1フレームずつ書き込みます。
引数名 | 説明 |
---|---|
filename | 出力する動画ファイル名 |
fourcc | コーデック指定(cv2.VideoWriter_fourccで定義) |
fps | フレームレート(例:20.0) |
frameSize | フレームサイズ(幅, 高さ)のタプル |
import cv2
# 動画保存用の設定
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
out.write(frame) # フレームを書き込む
cv2.imshow("Frame", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()
図形描画/アノテーション
cv2.line()やcv2.rectangle()を使って画像に図形を描画できます。
文字はcv2.putText()により、任意のフォント・サイズ・位置で追加可能です。
開発やデバッグ用途において、画像への印付けが非常に役立ちます。
カスタマイズ性も高く、色・太さなど細かく指定可能です。
メソッド名 | 説明 |
---|---|
rectangle | 矩形を描画 |
circle | 円を描画 |
line | 線分を描画 |
putText | 文字列を画像上に描画 |
polylines / fillPoly | 多角形や塗りつぶし領域の描画 |
rectangle
矩形(長方形)を画像上に描画する関数です。
始点と終点の座標を指定し、色や線の太さを設定できます。
物体の検出結果の可視化などに使われます。
引数名 | 説明 |
---|---|
img | 描画対象の画像(NumPy配列) |
pt1 | 左上の座標(x, y)タプル |
pt2 | 右下の座標(x, y)タプル |
color | 線の色(BGR形式)例: (0, 255, 0)は緑 |
thickness | 線の太さ。負の値にすると塗りつぶし |
lineType | 線の種類(オプション) |
import cv2
import numpy as np
img = np.zeros((300, 300, 3), dtype=np.uint8) # 黒背景画像作成
cv2.rectangle(img, (50, 50), (250, 200), (0, 255, 0), 3) # 緑色の矩形を描画
cv2.imwrite("rectangle_output.jpg", img) # 結果保存
circle
指定した中心座標と半径で円を描画します。
色や線の太さを設定でき、thickness=-1で塗りつぶしが可能です。
引数名 | 説明 |
---|---|
img | 描画対象の画像 |
center | 円の中心(x, y)タプル |
radius | 半径(整数) |
color | 円の色(BGR) |
thickness | 線の太さ。-1で塗りつぶし |
lineType | 線の種類(オプション) |
img = np.zeros((300, 300, 3), dtype=np.uint8)
cv2.circle(img, (150, 150), 80, (255, 0, 0), -1) # 青色の塗りつぶし円を描画
cv2.imwrite("circle_output.jpg", img)
line
始点から終点まで直線を描画します。
ガイド線や枠線などに利用されます。
引数名 | 説明 |
---|---|
img | 描画対象の画像 |
pt1 | 始点(x, y)タプル |
pt2 | 終点(x, y)タプル |
color | 線の色(BGR) |
thickness | 線の太さ(オプション) |
lineType | 線の種類(オプション) |
img = np.zeros((300, 300, 3), dtype=np.uint8)
cv2.line(img, (0, 0), (300, 300), (0, 0, 255), 5) # 赤い線を描画
cv2.imwrite("line_output.jpg", img)
putText
画像上に任意の文字列を描画できます。
フォント、サイズ、色、位置などが指定可能で注釈やラベルに便利です。
引数名 | 説明 |
---|---|
img | 描画対象の画像 |
text | 描画する文字列 |
org | 左下の座標(x, y) |
fontFace | フォント種類(例:cv2.FONT_HERSHEY_SIMPLEX) |
fontScale | フォントサイズ(倍率) |
color | 文字の色(BGR) |
thickness | 線の太さ |
lineType | 線の種類(オプション) |
img = np.zeros((300, 300, 3), dtype=np.uint8)
cv2.putText(img, "Hello OpenCV", (10, 150), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
cv2.imwrite("text_output.jpg", img)
polylines / fillPoly
polylines()は輪郭線付きの多角形を描き、fillPoly()は内部を塗りつぶした多角形を描画します。
引数名 | 説明 |
---|---|
img | 描画対象の画像 |
pts | 頂点の配列(NumPy配列) |
isClosed | 閉じた形にするか(polylines専用) |
color | 線または塗りの色 |
thickness | 線の太さ(polylinesのみ) |
img = np.zeros((300, 300, 3), dtype=np.uint8)
pts = np.array([[50, 50], [250, 100], [200, 250], [100, 200]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(img, [pts], isClosed=True, color=(0, 255, 255), thickness=3) # 多角形描画
cv2.fillPoly(img, [pts], color=(100, 100, 255)) # 同じ形を塗りつぶし
cv2.imwrite("polygon_output.jpg", img)
色変換/チャンネル操作
OpenCVでは画像の色空間変換を cv2.cvtColor()で行えます。
BGR→グレースケールやBGR→HSVなどへの変換が代表的です。
cv2.split()でチャンネルを分解し、cv2.merge()で再構築も可能です。
色情報を抽出・制御する処理の基本として多用されます。
メソッド名 | 説明 |
---|---|
cvtColor | BGR ↔ グレースケール・HSVなどの変換 |
mixChannels | チャンネルの組み換え |
inRange | 色領域の二値化(色抽出) |
split / merge | チャンネル分割/統合 |
cvtColor
画像の色空間(BGR、グレースケール、HSVなど)を変換する関数です。
変換コードを指定して、目的の形式に変換できます。
引数名 | 説明 |
---|---|
src | 入力画像(BGR形式が一般的) |
code | 変換コード(例:cv2.COLOR_BGR2GRAY) |
# BGR画像をグレースケールに変換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
mixChannels
複数画像のチャンネルを別の順序・形式に変換します。
高度な色変換やマルチチャンネル編集に利用されます。
引数名 | 説明 |
---|---|
src | 入力画像のリスト |
dst | 出力画像のリスト |
fromTo | チャンネルのマッピング指示(例:[0,1, 1,2]) |
src = [img]
dst = [np.zeros_like(img)]
# B→G, G→R へと変換(仮の例)
cv2.mixChannels(src, dst, [0, 1, 1, 2])
inRange
指定した色の範囲内にあるピクセルを白(255)、それ以外を黒(0)にしたマスク画像を作成します。
引数名 | 説明 |
---|---|
src | 入力画像(通常はHSVなどに変換後) |
lowerb | 抽出する色の下限(NumPy配列またはタプル) |
upperb | 抽出する色の上限(NumPy配列またはタプル) |
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 赤系の色範囲抽出
mask = cv2.inRange(hsv, (0, 100, 100), (10, 255, 255))
split / merge
カラー画像をB・G・Rチャンネルに分割したり、分割済みのチャンネルを統合する際に使用します。
メソッド名 | 引数 | 説明 |
---|---|---|
split() | src | 入力画像(多チャンネル) |
merge() | mv | チャンネルのリスト(例:[b, g, r]) |
# 分割
b, g, r = cv2.split(img)
# 青チャンネルだけを残して再統合(他をゼロに)
merged = cv2.merge([b, np.zeros_like(g), np.zeros_like(r)])
エッジ&輪郭検出
エッジ検出には、cv2.Canny()が使われ、物体の境界を明確にします。
cv2.findContours()により、輪郭の形や領域を抽出できます。
抽出した輪郭はcv2.drawContours()で可視化できます。
検出した輪郭から面積や中心点などの形状情報も計算できます。
メソッド名 | 説明 |
---|---|
Canny | エッジ検出 |
findContours | 輪郭抽出 |
approxPolyDP | 輪郭近似 |
minEnclosingCircle / minAreaRect | 最小外接円・外接矩形の取得 |
moments / contourArea | 輪郭の面積・モーメント計算 |
Canny
画像のエッジ(輪郭線)を検出するメソッドです。
ノイズに強く、物体の輪郭検出に広く使用されます。
2つの閾値を設定し、それに基づいて勾配の強い部分をエッジとして抽出します。
引数名 | 説明 |
---|---|
image | 入力画像(グレースケール推奨) |
threshold1 | 最小閾値(小さい方) |
threshold2 | 最大閾値(大きい方) |
apertureSize | Sobelフィルターのカーネルサイズ(省略可) |
L2gradient | True: L2ノルム使用(精度向上) |
import cv2
img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE) # グレースケールで画像読み込み
edges = cv2.Canny(img, 100, 200) # エッジ検出実行
cv2.imshow("Edges", edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
findContours
画像から輪郭線を検出します。
通常、2値画像(白黒)を入力とし、物体の外形や構造を取得できます。
輪郭はリスト構造で返され、後続処理(面積計算や描画など)に使えます。
引数名 | 説明 |
---|---|
image | 2値画像(エッジ検出やしきい値処理済みの画像) |
mode | 輪郭の抽出方法(例: cv2.RETR_EXTERNAL) |
method | 輪郭の近似方法(例: cv2.CHAIN_APPROX_SIMPLE) |
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 輪郭抽出
cv2.drawContours(img, contours, -1, (0, 255, 0), 2) # 緑で輪郭描画
cv2.imshow("Contours", img)
cv2.waitKey(0)
approxPolyDP
与えられた輪郭を、より単純な形(例えば四角形)に近似します。
図形認識(例: 三角形、矩形、五角形など)に用いられます。
引数名 | 説明 |
---|---|
curve | 入力輪郭 |
epsilon | 許容誤差。輪郭の周囲長に対する割合などで指定 |
closed | True: 閉じた輪郭として扱う |
for cnt in contours:
approx = cv2.approxPolyDP(cnt, 0.02 * cv2.arcLength(cnt, True), True) # 輪郭を近似
cv2.drawContours(img, [approx], 0, (255, 0, 0), 2) # 青色で描画
cv2.imshow("Approximated Contours", img)
cv2.waitKey(0)
minEnclosingCircle / minAreaRect
minEnclosingCircleは、輪郭を囲む最小の円を算出し、物体のサイズや中心の解析に使われます。
minAreaRectは、回転可能な最小の矩形を検出します(傾きのある物体でも対応可能)。
返される値は中心・角度・幅高さを含みます。
引数名 | 説明 |
---|---|
points | 輪郭や座標リスト / 輪郭または点列 |
# 最小外接円の取得
(x, y), radius = cv2.minEnclosingCircle(cnt) # 最小外接円
center = (int(x), int(y))
radius = int(radius)
cv2.circle(img, center, radius, (0, 0, 255), 2) # 赤色で円描画
# 最小外接矩形の取得
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = box.astype(int)
cv2.drawContours(img, [box], 0, (0, 255, 255), 2) # 黄色で描画
moments / contourArea
画像や輪郭の形状情報(面積、重心、周囲の歪みなど)を数値で返します。
重心座標などの特徴抽出に使用されます。
引数名 | 説明 |
---|---|
array | 輪郭データ |
M = cv2.moments(cnt)
cx = int(M["m10"] / M["m00"]) # x座標(重心)
cy = int(M["m01"] / M["m00"]) # y座標(重心)
cv2.circle(img, (cx, cy), 3, (0, 255, 0), -1) # 緑色で重心を描画
フィルタ処理
cv2.blur()やcv2.GaussianBlur()により画像を平滑化し、ノイズを低減します。
cv2.medianBlur()は特に塩胡椒ノイズに有効です。
cv2.bilateralFilter()は、輪郭を保持しつつノイズ除去ができる高度な手法です。
画像の前処理やエッジ強調・ぼかし処理などに使用されます。
メソッド名 | 説明 |
---|---|
blur | 平滑化(ボックスフィルタ) |
GaussianBlur | ガウシアン平滑化 |
medianBlur | 中央値フィルタ |
bilateralFilter | エッジ保護平滑化 |
filter2D | カスタム畳み込み |
boxFilter | 高速ボックスフィルタ |
blur
画像を単純なボックスフィルタで平滑化します。
各ピクセル周辺の平均値を取ることでノイズ除去が可能です。
引数名 | 説明 |
---|---|
src | 入力画像 |
ksize | カーネルサイズ(幅, 高さ) |
anchor | アンカー位置(デフォルトは中心) |
borderType | 境界処理方法(省略可、通常はcv2.BORDER_DEFAULT) |
import cv2
img = cv2.imread("image.jpeg")
# カーネルサイズ (5, 5) で平均化フィルタを適用
blurred = cv2.blur(img, (5, 5))
cv2.imwrite("blur_result.jpg", blurred)
GaussianBlur
ガウス関数に基づいて画像を平滑化します。
ノイズ除去に強く、エッジがなだらかになります。
引数名 | 説明 |
---|---|
src | 入力画像 |
ksize | カーネルサイズ(奇数, 奇数) |
sigmaX | X方向のガウス標準偏差 |
sigmaY | Y方向(省略可、sigmaXと同じになる) |
borderType | 境界処理方法(省略可) |
# (5, 5) のガウスカーネル、標準偏差1で平滑化
blurred = cv2.GaussianBlur(img, (5, 5), 1)
cv2.imwrite("gaussian_result.jpg", blurred)
medianBlur
カーネル内の中央値で画素値を置き換える平滑化手法です。
塩胡椒ノイズに効果的です。
引数名 | 説明 |
---|---|
src | 入力画像 |
ksize | カーネルサイズ(奇数のみ) |
# カーネルサイズ 5 で中央値フィルタを適用
blurred = cv2.medianBlur(img, 5)
cv2.imwrite("median_result.jpg", blurred)
bilateralFilter
エッジを保ちながら平滑化を行う手法です。
ガウス空間+距離空間を考慮し、細部を残しつつノイズ除去します。
引数名 | 説明 |
---|---|
src | 入力画像 |
d | フィルタ直径(ピクセル単位) |
sigmaColor | 色空間におけるフィルタの標準偏差 |
sigmaSpace | 座標空間におけるフィルタの標準偏差 |
borderType | 境界処理方法(省略可) |
# d=9, 色標準偏差=75, 空間標準偏差=75 でエッジ保持平滑化
blurred = cv2.bilateralFilter(img, 9, 75, 75)
cv2.imwrite("bilateral_result.jpg", blurred)
filter2D
任意のカーネルを使って2D畳み込み演算を行う関数です。
エッジ検出やシャープ化などにも使用されます。
引数名 | 説明 |
---|---|
src | 入力画像 |
ddepth | 出力画像の深度(-1なら入力と同じ) |
kernel | カーネル行列(NumPy配列) |
anchor | アンカー(デフォルトは中心) |
delta | 演算後に加算される値 |
borderType | 境界処理方法(省略可) |
import numpy as np
# シャープ化用のカーネル
kernel = np.array([[0, -1, 0], [-1, 5,-1], [0, -1, 0]])
# カスタムフィルタを適用
filtered = cv2.filter2D(img, -1, kernel)
cv2.imwrite("filter2D_result.jpg", filtered)
boxFilter
高速なボックスフィルタを適用する関数で、ブラーと似ていますが正確な積分を使います。
引数名 | 説明 |
---|---|
src | 入力画像 |
ddepth | 出力画像の深度(-1なら入力と同じ) |
ksize | カーネルサイズ(幅, 高さ) |
normalize | 正規化(Trueで平均化、Falseで単なる合計) |
anchor | アンカー位置 |
borderType | 境界処理方法(省略可) |
# 正規化ありのボックスフィルタ(平均化)
filtered = cv2.boxFilter(img, -1, (5, 5), normalize=True)
cv2.imwrite("boxfilter_result.jpg", filtered)
モルフォロジー
モルフォロジー処理は画像の構造を変形させる操作で、主に二値画像に用います。
cv2.erode()(収縮)やcv2.dilate()(膨張)で物体を細く・太くします。
cv2.morphologyEx()では、開閉処理(Open/Close)など複雑な操作が可能です。
ノイズ除去や物体の繋がり強調に適しています。
メソッド名 | 説明 |
---|---|
erode | 収縮処理 |
dilate | 膨張処理 |
morphologyEx | 開閉処理/トプハットなど |
erode
cv2.erode()は、指定されたカーネルを用いて画像の明るい領域を収縮させる処理を行います。
物体の輪郭を細くしたり、ノイズ除去に使われます。
対象領域が小さくなっていくため、白いノイズ除去などに効果的です。
引数名 | 説明 |
---|---|
src | 入力画像(8ビット、1チャンネルまたは3チャンネル) |
kernel | 処理に使用する構造化要素(カーネル) |
iterations | 収縮処理の繰り返し回数(デフォルトは1) |
borderType | 境界処理方法(省略可) |
borderValue | 境界値(省略可) |
import cv2
import numpy as np
# 画像を読み込む
img = cv2.imread("image.jpeg", 0) # グレースケール読み込み
kernel = np.ones((5,5), np.uint8) # 5x5の正方形カーネルを定義
# 収縮処理を実施
eroded = cv2.erode(img, kernel, iterations=1)
# 結果を保存
cv2.imwrite("eroded_image.jpeg", eroded)
dilate
cv2.dilate()は、指定したカーネルで画像の明るい領域を膨張させる処理です。
収縮とは逆で、白い領域が広がります。
ノイズ除去やオブジェクトの強調に利用されます。
引数名 | 説明 |
---|---|
src | 入力画像(8ビット、1チャンネルまたは3チャンネル) |
kernel | 処理に使用する構造化要素(カーネル) |
iterations | 収縮処理の繰り返し回数(デフォルトは1) |
borderType | 境界処理方法(省略可) |
borderValue | 境界値(省略可) |
import cv2
import numpy as np
# 画像を読み込む
img = cv2.imread("image.jpeg", 0) # グレースケール画像
kernel = np.ones((5,5), np.uint8) # カーネル定義
# 膨張処理を実行
dilated = cv2.dilate(img, kernel, iterations=1)
# 結果を保存
cv2.imwrite("dilated_image.jpeg", dilated)
morphologyEx
cv2.morphologyEx()は、収縮・膨張を組み合わせた高度なモルフォロジー変換を行う関数です。
開閉処理(Opening/Closing)やトップハットなどが選択できます。
ノイズ除去や構造解析に効果的です。
引数名 | 説明 |
---|---|
src | 入力画像(8ビット、1チャンネルまたは3チャンネル) |
op | 実行するモルフォロジー操作(cv2.MORPH_OPEN など) |
kernel | 処理に使用する構造化要素(カーネル) |
iterations | 収縮処理の繰り返し回数(デフォルトは1) |
borderType | 境界処理方法(省略可) |
borderValue | 境界値(省略可) |
import cv2
import numpy as np
# 入力画像
img = cv2.imread("image.jpeg", 0) # グレースケール画像
kernel = np.ones((5,5), np.uint8) # カーネル作成
# 開処理(小さなノイズ除去)
morphed = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
# 結果の保存
cv2.imwrite("morphology_open.jpeg", morphed)
二値化/しきい値処理
cv2.threshold()を使えば、指定したしきい値で画素を白黒に変換できます。
cv2.adaptiveThreshold()は局所的にしきい値を決めるため、照明の影響を受けにくいです。
輪郭検出やOCRなどの前処理に欠かせない操作です。
画像を構造的に単純化して解析をしやすくします。
メソッド名 | 説明 |
---|---|
threshold | 単純二値化 |
adaptiveThreshold | 適応的二値化 |
equalizeHist | ヒストグラム平坦化(コントラスト強調) |
threshold
画像に固定のしきい値を適用し、2値画像を生成します。
一定の明るさを超える画素を白、それ以外を黒に分類するなど画像分割に使用されます。
引数名 | 説明 |
---|---|
src | 入力グレースケール画像 |
thresh | 閾値(この値より大きいかどうかで分岐) |
maxval | 出力画像で白(または設定値)にする画素値 |
type | 二値化の方法(cv2.THRESH_BINARY など) |
import cv2
img = cv2.imread("image.jpg", 0) # グレースケールで画像読み込み
_, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # しきい値127で単純二値化
cv2.imshow("Binary Image", binary)
cv2.waitKey(0)
cv2.destroyAllWindows()
adaptiveThreshold
局所領域ごとに異なるしきい値を使って2値化を行うことで、照明のムラや影のある画像にも対応可能です。
細かな文字認識などにも有効です。
引数名 | 説明 |
---|---|
src | 入力グレースケール画像 |
maxValue | 出力画像で白(または設定値)にする画素値 |
adaptiveMethod | しきい値計算方法(cv2.ADAPTIVE_THRESH_MEAN_Cなど) |
thresholdType | 二値化の種類(通常はcv2.THRESH_BINARY) |
blockSize | 局所領域のサイズ(奇数) |
C | 平均または重みから引く定数 |
import cv2
img = cv2.imread("image.jpg", 0) # グレースケールで読み込み
adaptive = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
cv2.THRESH_BINARY, 11, 2) # 適応的二値化
cv2.imshow("Adaptive Threshold", adaptive)
cv2.waitKey(0)
cv2.destroyAllWindows()
equalizeHist
グレースケール画像の輝度分布を均一化して、暗い画像のコントラストを改善します。
医用画像や監視カメラ映像など、視認性の向上に有効です。
引数名 | 説明 |
---|---|
src | 入力グレースケール画像 |
import cv2
img = cv2.imread("image.jpg", 0) # グレースケールで読み込み
equalized = cv2.equalizeHist(img) # ヒストグラム平坦化
cv2.imshow("Equalized Image", equalized)
cv2.waitKey(0)
cv2.destroyAllWindows()
幾何変換/補正
画像の回転や拡大縮小、射影変換はcv2.warpAffine()やcv2.warpPerspective()で実施します。
変換行列は、cv2.getRotationMatrix2D()やcv2.getPerspectiveTransform()で取得します。
歪み補正は、cv2.undistort() を使いレンズ歪みも補正できます。
位置合わせや台形補正など、画像の整形に使用されます。
メソッド名 | 説明 |
---|---|
getRotationMatrix2D | 回転変換行列の取得 |
getPerspectiveTransform | 射影変換行列の取得 |
warpAffine | アフィン変換の実行 |
warpPerspective | 射影変換(透視変換)の実行 |
remap | 画素マッピングによる変換 |
undistort / fisheye補正 | レンズ歪み補正 |
getOptimalNewCameraMatrix | キャリブレーション補正用行列算出 |
getRotationMatrix2D
画像を回転させるためのアフィン変換行列を取得する関数です。
2次元の回転中心・角度・スケールを指定できます。
warpAffineと組み合わせて画像を回転可能です。
引数名 | 説明 |
---|---|
center | 回転の中心座標(タプル) |
angle | 回転角度(度単位) |
scale | 拡大・縮小率(1.0で等倍) |
import cv2
# 画像読み込み
img = cv2.imread('sample.jpg')
# 回転行列取得(画像中心を中心に45度回転、スケール1.0)
M = cv2.getRotationMatrix2D((img.shape[1]/2, img.shape[0]/2), 45, 1.0)
# 回転適用
rotated = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
getPerspectiveTransform
4点の対応関係をもとに射影変換行列(3×3)を取得します。
遠近感や傾きのある画像を補正するのに使用します。
warpPerspectiveと組み合わせて変換を適用します。
引数名 | 説明 |
---|---|
src | 変換前の4点座標(NumPy配列、float32型) |
dst | 変換後の4点座標(NumPy配列、float32型) |
import numpy as np
# 射影変換元と先の座標
pts1 = np.float32([[0,0], [300,0], [0,300], [300,300]])
pts2 = np.float32([[0,0], [250,50], [50,250], [300,300]])
# 射影変換行列の取得
M = cv2.getPerspectiveTransform(pts1, pts2)
warpAffine
2×3のアフィン変換行列を使って画像を変形する関数です。
平行移動、回転、拡大縮小が可能です。
getRotationMatrix2D()などと併用します。
引数名 | 説明 |
---|---|
src | 入力画像 |
M | アフィン変換行列(2×3) |
dsize | 出力画像サイズ(幅, 高さ) |
# 回転行列からアフィン変換
rotated = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
warpPerspective
3×3の射影変換行列を用いて画像に透視変換を適用する関数です。
平行線が収束するような変形も表現可能です。
getPerspectiveTransform()と組み合わせます。
引数名 | 説明 |
---|---|
src | 入力画像 |
M | 射影変換行列(3×3) |
dsize | 出力画像サイズ(幅, 高さ) |
# 射影変換適用
warped = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0]))
remap
ピクセル単位でマッピングを指定して画像を変形する関数です。
歪み補正や極座標変換などのカスタムマッピングが可能です。
マッピング行列(x座標・y座標)を指定して変換します。
引数名 | 説明 |
---|---|
src | 入力グレースケール画像 |
map1 | x座標のマッピング行列 |
map2 | y座標のマッピング行列 |
interpolation | 補間方法(cv2.INTER_LINEARなど) |
map_x, map_y = np.meshgrid(np.arange(img.shape[1]), np.arange(img.shape[0]))
remapped = cv2.remap(img, map_x.astype(np.float32), map_y.astype(np.float32), cv2.INTER_LINEAR)
undistort / fisheye
カメラの歪み係数に基づき、画像の歪み(レンズ歪み)を補正します。
事前にキャリブレーション済のカメラ行列・歪み係数が必要です。
cv2.fisheyeは魚眼レンズ補正用です。
引数名 | 説明 |
---|---|
src | 歪んだ画像 |
cameraMatrix | カメラ行列 |
distCoeffs | 歪み係数 |
newCameraMatrix | 補正後カメラ行列(省略可) |
# 歪み補正実行
undistorted = cv2.undistort(img, cameraMatrix, distCoeffs)
getOptimalNewCameraMatrix
カメラ行列を再計算して、画像の不要領域を除いた補正済画像の最適サイズを取得します。
undistortと併用することでクロッピング効果があります。
視野や歪みのバランスを最適化できます。
引数名 | 説明 |
---|---|
cameraMatrix | 元のカメラ行列 |
distCoeffs | 歪み係数 |
imageSize | 入力画像サイズ |
alpha | 0〜1の値(0で切り取り、1で完全視野) |
newCameraMatrix, _ = cv2.getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, (w, h), 1)
特徴点/テンプレートマッチング
cv2.matchTemplate()でテンプレート画像を対象画像から検索できます。
cv2.ORB()やcv2.SIFT()などを用いると、特徴点抽出・マッチングが可能です。
画像比較や物体検出の基礎となる技術で、精度の高い検出ができます。
複数の手法を組み合わせてロバストな認識が可能になります。
メソッド名 | 説明 |
---|---|
matchTemplate | テンプレートマッチング |
goodFeaturesToTrack | 特徴点抽出(Shi-Tomasi) |
ORB / AKAZE / SIFT / SURF | 特徴量抽出・記述子計算 |
matchTemplate
画像内からテンプレート画像と一致する部分を探すためのメソッドです。
スライドさせながら類似度を計算し、マッチした領域のスコア画像を生成します。
引数名 | 説明 |
---|---|
image | 入力画像(テンプレートを探す対象) |
templ | テンプレート画像(部分的に一致を探す対象) |
method | 類似度の比較手法(例:cv2.TM_CCOEFFなど) |
import cv2
image = cv2.imread('image.jpg', 0) # グレースケール読み込み
template = cv2.imread('template.jpg', 0)
# テンプレートマッチングの実行
result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
# 類似度が最大の位置を取得
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
# マッチした領域を矩形で囲む
h, w = template.shape
cv2.rectangle(image, max_loc, (max_loc[0]+w, max_loc[1]+h), 255, 2)
goodFeaturesToTrack
Shi-Tomasi法により画像から特徴的な点(コーナー)を抽出します。
物体追跡や動き検出の前処理として有効です。
引数名 | 説明 |
---|---|
image | 入力画像(グレースケール) |
maxCorners | 抽出する特徴点の最大数 |
qualityLevel | 最小の品質レベル(0.01など) |
minDistance | 特徴点間の最小距離(ピクセル) |
import cv2
import numpy as np
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 特徴点抽出(Shi-Tomasi)
corners = cv2.goodFeaturesToTrack(gray, maxCorners=50, qualityLevel=0.01, minDistance=10)
# 特徴点の描画
for pt in corners:
x, y = pt.ravel()
cv2.circle(img, (int(x), int(y)), 3, (0, 255, 0), -1)
ORB / AKAZE / SIFT / SURF
画像の局所的な特徴点を抽出・記述し、マッチングや物体認識に利用されます。
特にSIFTやORBはロバスト性の高い特徴記述子です。
引数名 | 説明 |
---|---|
nfeatures | 抽出する特徴点の最大数 |
scaleFactor | スケールピラミッドの縮小率 |
nlevels | ピラミッドのレベル数 |
ORB
import cv2
img = cv2.imread('image.jpg', 0)
# ORBの生成と特徴検出+記述子の計算
orb = cv2.ORB_create(nfeatures=500)
keypoints, descriptors = orb.detectAndCompute(img, None)
# 特徴点の描画
img_out = cv2.drawKeypoints(img, keypoints, None, color=(0,255,0))
AKAZE(OpenCV >= 4.4以降)
akaze = cv2.AKAZE_create()
keypoints, descriptors = akaze.detectAndCompute(img, None)
SIFT
sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(img, None)
SURF(有償モジュール)
surf = cv2.xfeatures2d.SURF_create()
keypoints, descriptors = surf.detectAndCompute(img, None)
直線/円検出(ハフ変換)
cv2.HoughLines()で画像から直線を、cv2.HoughCircles()で円を検出できます。
事前にCannyなどでエッジ検出しておくと精度が向上します。
図形ベースの構造認識や、領域の特定に役立ちます。
一定の形状を持つ物体の検出(例:道路標識、車輪など)に有効です。
メソッド名 | 説明 |
---|---|
HoughLines | 直線検出 |
HoughLinesP | 確率的ハフ直線検出 |
HoughCircles | 円検出 |
HoughLines
2値画像からハフ変換を用いて直線を検出します。
直線は極座標(ρ, θ)で表現され、出力としてその組み合わせが返されます。
検出された直線を描画するにはρとθを使って座標変換する必要があります。
引数名 | 説明 |
---|---|
image | 2値画像(cv2.Canny()などでエッジ検出済み) |
rho | ρの解像度(ピクセル単位、例:1) |
theta | θの解像度(ラジアン単位、例:np.pi/180) |
threshold | 投票数のしきい値(この値以上の交差がある場合に直線と判定) |
import cv2
import numpy as np
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# エッジ検出
edges = cv2.Canny(gray, 50, 150)
# ハフ変換による直線検出
lines = cv2.HoughLines(edges, 1, np.pi/180, 100)
# 検出された各直線を描画
for line in lines:
rho, theta = line[0]
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
pt1 = (int(x0 + 1000*(-b)), int(y0 + 1000*(a)))
pt2 = (int(x0 - 1000*(-b)), int(y0 - 1000*(a)))
cv2.line(img, pt1, pt2, (0, 0, 255), 2)
HoughLinesP
HoughLinesの改良版で、端点情報を直接返すことで直線の描画が容易です。
処理効率が高く、特にノイズの多い画像や動画向きです。
出力は[x1, y1, x2, y2]の端点座標です。
引数名 | 説明 |
---|---|
image | 2値画像(エッジ検出済み) |
rho | 距離分解能(ピクセル) |
theta | 角度分解能(ラジアン) |
threshold | 投票数しきい値(直線とみなす最小交差数) |
minLineLength | 最小の線分長(これ未満の線分は無視される) |
maxLineGap | 同一直線上と見なされる2点間の最大ギャップ |
lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=80, minLineLength=50, maxLineGap=10)
# 線分の描画
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(img, (x1, y1), (x2, y2), (255, 0, 0), 2)
HoughCircles
画像中の円形パターンを検出するための手法です。
cv2.HOUGH_GRADIENTモードで、エッジと勾配情報をもとに高速に円を検出します。
出力は[[x, y, r], …]形式の円リストです。
引数名 | 説明 |
---|---|
image | 入力画像(グレースケール) |
method | ハフ変換の手法(通常はcv2.HOUGH_GRADIENT) |
dp | 累積配列の分解能(画像サイズに対する比率。通常は1以上) |
minDist | 検出される円の中心同士の最小距離 |
param1 | 内部のCannyエッジ検出の上限閾値 |
param2 | 円検出のしきい値(小さいほど多くの円が検出される) |
minRadius | 最小半径 |
maxRadius | 最大半径 |
gray = cv2.medianBlur(gray, 5) # ノイズ除去(推奨)
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1.2, minDist=50,
param1=100, param2=30, minRadius=10, maxRadius=100)
if circles is not None:
circles = np.uint16(np.around(circles))
for x, y, r in circles[0]:
# 円を描画
cv2.circle(img, (x, y), r, (0, 255, 0), 2)
# 中心点を描画
cv2.circle(img, (x, y), 2, (0, 0, 255), 3)
ピクセル操作/数理演算
画像同士の差分はcv2.absdiff()、重ね合わせはcv2.addWeighted()で行えます。
cv2.normalize()やcv2.minMaxLoc()により、統計的な画素分析も可能です。
マスク付きの加算や論理演算もサポートされています。
画像比較/変化検出/重み付け合成などの処理に用います。
メソッド名 | 説明 |
---|---|
absdiff | 絶対差画像計算 |
addWeighted | 加重合成 |
divide / multiply | チャンネルごとの除算・乗算 |
normalize | 値の正規化 |
minMaxLoc | 最大・最小値と位置の検出 |
distanceTransform | 二値地図の距離変換 |
threshold(再掲) | 絶対値比較による二値化 |
absdiff
2枚の画像または配列間の要素ごとの差分の絶対値を計算します。
差分の大きさを視覚的に捉える際に便利で、動きの検出や画像比較などに使用されます。
入力画像は同じサイズ・型である必要があります。
引数名 | 説明 |
---|---|
src1 | 比較対象の1枚目の画像 |
src2 | 比較対象の2枚目の画像 |
import cv2
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')
# 画像間の絶対差を計算
diff = cv2.absdiff(img1, img2)
# 差分結果を表示
cv2.imshow('AbsDiff', diff)
cv2.waitKey(0)
addWeighted
2枚の画像をそれぞれの重みで合成します。
フェード処理や画像ブレンドに使われる一般的な処理です。
オプションのgammaは全体の明るさ調整に使用されます。
引数名 | 説明 |
---|---|
src1 | 1枚目の画像 |
alpha | 1枚目の重み係数(0.0〜1.0) |
src2 | 2枚目の画像 |
beta | 2枚目の重み係数(0.0〜1.0) |
gamma | 加算する定数(明るさ補正など) |
# 画像の加重合成(フェード)
blended = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
cv2.imshow('Blended', blended)
cv2.waitKey(0)
divide / multiply
画像の各画素をチャンネル単位で除算または乗算します。
明るさ調整、正規化、マスク処理など多用途に使われます。
除算ではゼロ除算を防ぐための保護が自動的に行われます。
引数名 | 説明 |
---|---|
src1 | 入力画像または配列(分子/被乗数) |
src2 | 入力画像または配列(分母/乗数) |
dst | 出力先(省略可) |
scale | 結果に乗じるスケール係数(デフォルト1.0) |
# 除算:2枚の画像を画素ごとに除算
div_result = cv2.divide(img1, img2)
# 乗算:画像の明るさを調整(1.2倍)
brightened = cv2.multiply(img1, 1.2)
cv2.imshow('Divide', div_result)
cv2.imshow('Brightened', brightened)
cv2.waitKey(0)
normalize
画像や行列の値を指定範囲にスケーリングします。
明るさの均一化やヒストグラムの補正などに使われます。
norm_typeでL1/L2ノルムやMinMax正規化を指定できます。
引数名 | 説明 |
---|---|
src | 入力画像または行列 |
dst | 出力先(省略可能) |
alpha | 出力範囲の最小値 |
beta | 出力範囲の最大値 |
norm_type | 正規化の種類(cv2.NORM_MINMAXなど) |
dtype | 出力のデータ型(省略時は入力と同じ) |
# 画像の画素値を0〜255に正規化
norm = cv2.normalize(img1, None, 0, 255, cv2.NORM_MINMAX)
cv2.imshow('Normalized', norm)
cv2.waitKey(0)
minMaxLoc
画像や配列の最小・最大値、およびその位置を取得します。
ヒートマップやテンプレートマッチング結果の分析に活用されます。
入力は1チャンネル画像(通常グレースケール)です。
引数名 | 説明 |
---|---|
src | 入力画像(1チャンネル) |
mask | 処理対象を限定するマスク画像(省略可) |
gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
# 画像内の最小・最大値とその座標を取得
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(gray)
print('Max at:', max_loc, ' Value:', max_val)
print('Min at:', min_loc, ' Value:', min_val)
distanceTransform
前景オブジェクトの輪郭から背景ピクセルまでの距離を計算します。
マスク処理やワーターシェッド法などの前処理として使われます。
前景は255、背景は0の2値画像を入力とします。
引数名 | 説明 |
---|---|
src | 入力画像(2値画像、前景=255) |
distanceType | 距離の種類(例:cv2.DIST_L2, DIST_L1) |
maskSize | マスクサイズ(3, 5 など奇数) |
# 二値画像の距離変換
gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
dist = cv2.distanceTransform(binary, distanceType=cv2.DIST_L2, maskSize=5)
# 結果のスケーリングと表示
norm = cv2.normalize(dist, None, 0, 255, cv2.NORM_MINMAX)
cv2.imshow('Distance Transform', norm.astype('uint8'))
cv2.waitKey(0)
threshold
指定したしきい値を基準に、画像の画素値を2値化します。
画素がしきい値を上回るか下回るかで0または最大値に分類されます。
cv2.THRESH_BINARYなど複数のモードが選べます。
引数名 | 説明 |
---|---|
src | 入力画像(通常はグレースケール) |
thresh | 閾値 |
maxval | 閾値を超えた画素に設定する値(例:255) |
type | 二値化の方法(例:cv2.THRESH_BINARY) |
# 画像を2値化(閾値127、最大値255)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('Threshold', binary)
cv2.waitKey(0)
画像分割/その他高度処理
cv2.watershed()を使うと、画像を領域ごとに分割できます。
cv2.inpaint()は、画像の破損部分を周囲から補完して修復します。
OCR前処理や画像補正、物体分離など応用的な画像解析が可能です。
高度なアルゴリズムと組み合わせることで、画像認識の精度を高められます。
メソッド名 | 説明 |
---|---|
watershed | ウォーターシェッドにより画像分割 |
inpaint | 欠損部の補間/修復 |
equalizeHist | (再掲)ヒストグラム平坦化 |
findHomography | ホモグラフィー行列計算(テンプレート類推で使用) |
watershed
ウォーターシェッド法により、画像を前景・背景・境界に分割します。
マーキングされたラベル画像をもとに、隣接ピクセルを“浸水”させながら領域を分離します。
輪郭抽出やセグメンテーションに用いられます。
引数名 | 説明 |
---|---|
image | 入力画像(3チャンネル、カラー画像) |
markers | ラベル(マーカー)を記した32bit整数型の画像(領域ごとに異なる整数値) |
import cv2
import numpy as np
# 入力画像読み込み
img = cv2.imread('coins.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二値化と輪郭抽出
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# ノイズ除去
kernel = np.ones((3,3), np.uint8)
opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations=2)
# 確実な背景領域
sure_bg = cv2.dilate(opening, kernel, iterations=3)
# 確実な前景領域
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
_, sure_fg = cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0)
# ラベリング(マーカー作成)
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg, sure_fg)
_, markers = cv2.connectedComponents(sure_fg)
markers = markers + 1
markers[unknown == 255] = 0
# ウォーターシェッドで境界分割
cv2.watershed(img, markers)
img[markers == -1] = [0, 0, 255] # 境界に赤線
cv2.imshow('Watershed', img)
cv2.waitKey(0)
inpaint
マスクで指定した領域を周囲の情報から補間して修復します。
傷や文字、ノイズの除去などに効果的です。
INPAINT_TELEAとINPAINT_NSの2種類のアルゴリズムがあります。
引数名 | 説明 |
---|---|
src | 元画像(修復対象) |
inpaintMask | 修復すべき領域を255で示すマスク(8bit単チャンネル) |
inpaintRadius | 補間の探索半径 |
flags | アルゴリズム(cv2.INPAINT_TELEA または cv2.INPAINT_NS) |
img = cv2.imread('damaged.png')
mask = cv2.imread('mask.png', 0) # 255で塗った領域を補間対象とする
# 欠損部分の補間(inpaint)
restored = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)
cv2.imshow('Inpainted', restored)
cv2.waitKey(0)
equalizeHist
画像の輝度ヒストグラムを均一化してコントラストを向上させます。
暗い画像やコントラストの弱い画像の明瞭化に適しています。
入力は1チャンネルのグレースケール画像です。
引数名 | 説明 |
---|---|
src | 入力画像(グレースケール) |
gray = cv2.imread('low_contrast.jpg', cv2.IMREAD_GRAYSCALE)
# ヒストグラム平坦化
equalized = cv2.equalizeHist(gray)
cv2.imshow('Equalized', equalized)
cv2.waitKey(0)
findHomography
2つの平面画像間の対応点を元に、射影変換(ホモグラフィ)行列を推定します。
テンプレートマッチングや画像の位置合わせに利用されます。
RANSACなどを用いた外れ値除去も可能です。
引数名 | 説明 |
---|---|
srcPoints | 元画像の対応点(Nx2の座標配列、float32) |
dstPoints | 対象画像の対応点(Nx2の座標配列、float32) |
method | 推定手法(例:cv2.RANSAC, cv2.LMEDS) |
ransacReprojThreshold | RANSACでの再投影誤差のしきい値(省略可) |
# 特徴点検出(ORB)とマッチング後のホモグラフィ推定例
img1 = cv2.imread('template.jpg', 0)
img2 = cv2.imread('scene.jpg', 0)
orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)
# 対応点抽出
src_pts = np.float32([kp1[m.queryIdx].pt for m in matches[:20]]).reshape(-1, 1, 2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in matches[:20]]).reshape(-1, 1, 2)
# ホモグラフィ行列を計算
H, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC)
# 射影変換(テンプレート領域をscene画像に重ねる)
h, w = img1.shape
pts = np.float32([[0,0], [0,h], [w,h], [w,0]]).reshape(-1,1,2)
dst = cv2.perspectiveTransform(pts, H)
img2_color = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR)
cv2.polylines(img2_color, [np.int32(dst)], True, (0,255,0), 2)
cv2.imshow('Homography', img2_color)
cv2.waitKey(0)