【Python/OpenCV】単純な二値化処理

この記事では、Python版OpenCV(cv2.threshold)もしくはNumPyで単純な二値化処理を実装する方法をソースコード付きで解説します。

二値化処理

二値画像とは、色を0(黒)と1(白)の二階調(1bit)で表した画像です。
ただし、画像処理プログラムでは、二値化画像の画素値を0(黒)と255(白)の8ビットで表す方が一般的です。
【参考】二値化処理の原理

二値化処理は、画像から物体の輪郭を取り出したりできる基本的な処理です。
この処理のポイントは、閾値の決め方にあります。
最も単純なのは、人が感覚的に閾値を設定する方法です。

自動的に最適な閾値を求める、より高度な「大津の二値化処理」「適応的二値化処理」については下記ページで紹介しています。
【Python/OpenCV】大津の手法で二値化処理
【Python/OpenCV】適応的閾値処理で二値化

今回は、Python言語で以下の2通りの方法で単純な2値化処理を実装してみました。

方法①・・・NumPyでアルゴリズムを書いて実装
方法②・・・cv2.thresholdで簡単に実装(1行で書けちゃうので楽チン)

書式(cv2.threshold)

ret, dst = cv2.threshold(src, threshold, max_value, threshold_type)
パラメータ名 説明
src 入力画像(グレースケール)
threshold 閾値
max_value 二値化したときの最大値(真っ白にするなら255)
threshold_type 使用する二値化手法(単純な二値化ならcv2.THRESH_BINARYを指定)
dst 出力画像

ソースコード(Python3+OpenCV3)

サンプルプログラムのソースコードです。

方法①

#-*- coding:utf-8 -*-
import cv2
import numpy as np

def main():
    # 閾値
    t = 127

    # 入力画像の読み込み
    img = cv2.imread("input.jpg")

    # グレースケール変換
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

    # 出力画像用の配列生成
    th1 = gray.copy()

    # 方法1(NumPyで実装)
    th1[gray < t] = 0
    th1[gray >= t] = 255

    # 結果を出力
    cv2.imwrite("th1.jpg", th1)

if __name__ == "__main__":
    main()

方法②

#-*- coding:utf-8 -*-
import cv2
import numpy as np


def main():
    # 閾値
    t = 127

    # 入力画像の読み込み
    img = cv2.imread("input.jpg")

    # グレースケール変換
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    
    # 方法2 (OpenCVで実装)      
    ret, th2 = cv2.threshold(gray, t, 255, cv2.THRESH_BINARY)    

    # 結果を出力
    cv2.imwrite("th2.jpg", th2)


if __name__ == "__main__":
    main()

※動作には、OpenCVライブラリのインストールが必要です。

実行結果

サンプルプログラムの実行結果です。

■入力画像(左)と出力画像(右)

【おすすめ記事】
PythonでOpenCV入門 サンプル集
【Python】画像処理プログラミング入門
【画像処理入門】アルゴリズム&プログラミング

シェア&フォローお願いします!