【Python】白黒画像の作成|OpenCVによる画像の2値化処理・モノクロ変換

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

こんな方におすすめ
  • Pythonによる画像処理に興味がある。
  • OpenCVの画像処理を適用し2値化した「白黒画像」を出力したい。
目次

OpenCVとは

OpenCV(Open Source Computer Vision Library)とは、画像処理やコンピュータビジョンの分野で広く活用されているオープンソースライブラリです。画像データの数値処理に強いのが特徴であり、高度な統計アルゴリズムも多数含まれていることから、近年機械学習の分野でも広く利用されています。

【Python】OpenCVによる2値化処理|白黒画像の出力

PythonのOpenCVライブラリをもとに2値化画像を出力する方法について解説します。

OpenCVの cv2.threshold メソッドを用いるのが特徴であり、ひな型は次のように記載できます。

ret,th_img = cv2.threshold(img,              # 入力画像(グレースケール画像を指定すること)
                           0,                # 閾値
                           255,              # 閾値を超えた画素に割り当てる値
                           cv2.THRESH_BINARY # 閾値処理方法
                          )

第1引数には、2値化したい画像を指定します。この時、必ずグレースケールの画像を指定するようにしましょう。第2引数には、画素値を識別するための閾値を指定します。第3引数には、閾値を超えた画素に割り当てる値を指定します。第4引数には、OpenCVで用意された閾値処理メソッドを指定します。

閾値処理メソッドには以下があります。メソッドを変えることで出力される2値化画像の特徴も変化します。

  • cv2.THRESH_OTSU
  • cv2.THRESH_BINARY
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TRUNC

実際の画像を用いてコードを実行してみましょう。いくつか例を示します。

画像の2値化|cv2.THRESH_BINARY

画像読込部分にお手元の画像のディレクトリを指定し、以下を実行してみましょう。

import cv2

# 画像読込
img = cv2.imread("image_data.jpg")

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

# モノクロ化
threshold  = 100
ret,th_img = cv2.threshold(img,                # 画像データ
                           100,                # 閾値
                           255,                # 閾値を超えた画素に割り当てる値
                           cv2.THRESH_BINARY   # 閾値処理方法
                          )
# 閾値確認
print(ret)

# 2値化後の画像を表示
cv2.imshow("img",th_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像の2値化|cv2.THRESH_OTSU

閾値に0を指定し、cv2.THRESH_OTSUを閾値処理方法として指定すると、閾値が自動で設定されます。

import cv2

# 画像読込
img = cv2.imread("image_data.jpg")

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


# 2値化
ret,th_img = cv2.threshold(img,              # 入力画像(グレースケール画像を指定すること)
                           0,                # 閾値
                           255,              # 閾値を超えた画素に割り当てる値
                           cv2.THRESH_OTSU   # 閾値処理方法
                          )
# 閾値確認
print(ret)

# 2値化後の画像を表示
cv2.imshow("img",th_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

【Python】OpenCV・トラックバーを用いた白黒画像の明るさ調節

トラックバーで閾値を変更し、白黒画像の明暗調節することができます。次のコードを実行してみましょう。

import cv2

# 画像読込
img = cv2.imread("image_data.jpg")

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

# トラックバー作成
def trackbar(position):
    # グローバル変数に指定
    global threshold
    threshold = position
    
# トラックバーのウィンドウ設定
cv2.namedWindow("img")

# 閾値 
threshold = 100

# トラックバー関数
cv2.createTrackbar("trackbar",      # トラックバー名
                   "img",           # ウィンドウ名
                   threshold,       # 閾値
                   255,             # 閾値の最大値
                   trackbar         # トラックバーの関数
                  )

# 画像の2値化処理
while True:
    th_img = cv2.adaptiveThreshold(img,                         # 入力画像
                                   255,                         # 閾値を超えた画素に割り当てる値
                                   cv2.ADAPTIVE_THRESH_MEAN_C,  # 適用的閾値処理(近傍領域の平均値採用)
                                   cv2.THRESH_BINARY,           # 閾値処理
                                   3,                           # ピクセルのしきい値計算に利用するピクセル近傍のサイズ
                                   threshold                    # 閾値                                  
                                  )
    # 画像表示
    cv2.imshow("img_trachbar",th_img)
    cv2.imshow("img",img)
    
    #エスケープキーを押すと強制終了
    if cv2.waitKey(10) == 27:
        break
        
cv2.destroyAllWindows()

【参考】Python・OpenCVを用いた画像処理

当サイトでは、PythonのOpenCVライブラリを用いた画像処理ノウハウを多数公開しています。

用途【Python×OpenCV】記事名
画像変換画像のリサイズ・拡大・縮小
画像変換画像の回転・反転・平行移動|アフィン変換
画像変換画像の明るさ調節|ガンマ補正
画像変換グレースケール・HSV・L*a*b|色空間の変換
画像変換モノクロ(白黒)画像変換|2値化処理
画像変換ヒストグラムの描画・ヒストグラム均一化処理
画像変換画像上にテキスト・図形(直線・長方形・円)を描画
画像変換画像の透視変換・遠近法
画像変換画像のノイズ除去・平滑化
画像変換画像の畳み込み(空間フィルタリング)
特徴抽出エッジの検出方法

画像認識や物体検出を学ぶ上でおすすめの教材はこちらをご参考ください。

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次