Pynote

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

OpenCV - inRange による範囲指定で2値化する方法について

概要

OpenCV の inRange による範囲指定で2値化する方法について紹介する。

試した環境

inRange()

inRange() により、範囲指定による2値化処理が行える。

{\displaystyle
dst(x, y) =
\left\{ 
\begin{array}{l}
255 & lower \le src(x, y) \le upper \\
0 & otherwise
\end{array}
\right.
}

dst = cv2.inRange(src, lowerb, upperb[, dst])

引数

  • src: 入力画像
  • lowerb: 下限
  • upperb: 上限
  • dst: 出力画像 (引数経由で受け取る場合)

返り値

  • dst: 出力画像

サンプルコード

今回使用する画像

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 画像を読み込む。
src = cv2.imread('tomato.png')
plt.imshow(src)

グレースケール画像

lower \le brightness \le upperピクセルは255、それ以外のピクセルは0として2値化する。

gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
plt.imshow(gray, plt.cm.gray)
plt.show()

dst = cv2.inRange(gray, 17, 215)

plt.imshow(dst, plt.cm.gray)
plt.show()


RGB 画像

lower \le (blue, green, red) \le upperピクセルは255、それ以外のピクセルは0として2値化する。

OpenCV の画像のチャンネルは BGR の順番なので、lower, upper も青、緑、赤の順で指定することに注意する。

dst = cv2.inRange(src, (0, 0, 49), (255, 255, 255))

plt.imshow(dst, plt.cm.gray)
plt.show()


HSV 画像

lower \le (hue, saturation, lightness) \le upperピクセルは255、それ以外のピクセルは0として2値化する。
RGB 形式から色相、彩度、明度で色を表現する HSV 形式に変換することで、範囲指定がしやすくなります。

hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)

dst = cv2.inRange(hsv, (0, 0, 49), (32, 94, 255))

plt.imshow(dst, plt.cm.gray)
plt.show()