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

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

【はじめに】二値化処理とは

まずはじめに、二値画像は「色を0(黒)と1(白)の二階調(1bit)で表した画像」です。
ただし、画像処理プログラムでは、二値化画像の画素値を0(黒)と255(白)の8ビットで表す方が一般的です。

画像を二値画像に変換することを二値化処理といい、ある閾値で画像を二値画像に変換します。画像から物体の輪郭を取り出したりできます。

■二値画像変換の例(左からRGBカラー画像 → グレースケール画像 → 二値画像)

お借りした画像:プロ生ちゃん(暮井 慧)

動画解説版

二値化処理のポイントは、閾値の決め方にあります。
最も単純なのは、人が感覚的に閾値を設定する方法です。

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

関連記事
二値化処理の原理
【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 + OpenCV

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

方法①

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

# 閾値
threshold_value = 127

# 入力画像の読み込み
img = cv2.imread("C:/github/sample/python/opencv/input.png")

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

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

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

# 結果を出力
cv2.imwrite("C:/github/sample/python/opencv/th.png", threshold_img)

方法②

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


# 閾値
threshold_value = 127

# 入力画像の読み込み
img = cv2.imread("C:/github/sample/python/opencv/input.png")

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

# 結果を出力
cv2.imwrite("C:/github/sample/python/opencv/th.png", threshold_img)

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

実行結果

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

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

関連記事
1 PythonでOpenCV入門 サンプル集
2 【Python】画像処理プログラミング入門
3 【画像処理入門】アルゴリズム&プログラミング
Python画像処理
技術雑記

コメント

タイトルとURLをコピーしました