Pynote

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

OpenCV - inRange で2値化する方法

概要

OpenCV の inRange で2値化する方法について紹介する。

inRange

cv2.inRange() で範囲を指定して2値化処理を行える。

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

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

引数

  • src: 入力画像
  • lowerb: 下限
  • upperb: 上限

返り値

  • dst: 出力画像

グレースケール画像

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

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

# 画像を読み込む。
src = cv2.imread("sample.png", cv2.IMREAD_GRAYSCALE)

# 2値化する。
dst = cv2.inRange(src, 17, 215)

fig, ax = plt.subplots(facecolor="w")
ax.imshow(dst, cmap="gray")

plt.show()


RGB 画像

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

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

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

# 画像を読み込む。
src = cv2.imread("sample.png")

# 2値化する。
dst = cv2.inRange(src, (0, 0, 49), (255, 255, 255))

fig, ax = plt.subplots(facecolor="w")
ax.imshow(dst, cmap="gray")

plt.show()


HSV 画像

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

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

# 画像を読み込む。
src = cv2.imread("sample.png")

# HSV に変換する。
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)

# 2値化する。
dst = cv2.inRange(hsv, (0, 0, 49), (32, 94, 255))

fig, ax = plt.subplots(facecolor="w")
ax.imshow(dst, cmap="gray")

plt.show()