Pynote

Python、機械学習、画像処理について

OpenCV - distanceTransform() で距離変換を行う

概要

OpenCV の distanceTransform() で距離変換を行う方法について紹介する。

画像における距離の定義

距離関数としては以下が使われる。

2つのピクセル(x_1, y_1), (x_2, y_2) としたとき、

  • L^\infty ノルム: max(|x_1 - x_2|, |y_1 - y_2|)
  • L1 ノルム (マンハッタン距離): |x_1 - x_2| + |y_1 - y_2|
  • L2 ノルム (ユークリッド距離): \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}

距離変換

距離変換 (distance transform) とは、2値画像を入力としたとき、その各ピクセルが最も近い値0までの距離マップ (distance map) を作成する処理である。
OpenCV では、distanceTransform() により行える。

dst = cv.distanceTransform(src, distanceType, maskSize[, dst[, dstType]])

引数

  • src: 2値画像
  • distanceType: 距離関数の種類
    • cv2.DIST_C: L^\infty ノルム
    • cv2.DIST_L1: L1 ノルム (マンハッタン距離)
    • cv2.DIST_L2: L2 ノルム
  • maskSize: 距離変換に使用するマスクの大きさ
  • dst: 出力画像 (引数経由で受け取る場合)
  • dstType: 出力画像の型

ラベルマップを生成する。

dst, labels = cv.distanceTransformWithLabels(
    src, distanceType, maskSize[, dst[, labels[, labelType]]])

引数

  • src: 2値画像
  • distanceType: 距離関数の種類
    • cv2.DIST_C: L^\infty ノルム
    • cv2.DIST_L1: L1 ノルム (マンハッタン距離)
    • cv2.DIST_L2: L2 ノルム
  • maskSize: 距離変換に使用するマスクの大きさ
  • dst: 出力画像 (引数経由で受け取る場合)
  • labels: ラベル (引数経由で受け取る場合)
  • labelType: ラベルの型

サンプルコード

import cv2
import numpy as np

src = np.array(
    [[0, 0, 0, 0, 1],
     [0, 1, 1, 1, 1],
     [0, 1, 0, 1, 1],
     [0, 1, 1, 1, 1],
     [0, 0, 0, 0, 1]],
    dtype=np.uint8)

dst = cv2.distanceTransform(src, cv2.DIST_L2, 5)
print(dst)
[[ 0.          0.          0.          0.          1.        ]
 [ 0.          1.          1.          1.          1.39999998]
 [ 0.          1.          0.          1.          2.        ]
 [ 0.          1.          1.          1.          1.39999998]
 [ 0.          0.          0.          0.          1.        ]]

参考