openCV

【OpenCV】画像を2値化(白黒)する。(python)

 

単純2値化

これはグレースケールの画像の各画素全体に任意の閾値を設定し、画素が設定した閾値より上か下かで各画素に0(黒)か255(白)の2パターンで表現する手法です。

単純2値化では処理ロジックこそ単純ですが、グレースケールと違い、白か黒の2パータンでの表現になるので処理後の画像に滑らかさは無くなります。

元画像
単純2値化

基本的な使い方

ポイントとしては元の画像を一度グレースケールに変更します。

画像を2値化(白黒)する場合は基本的に以下のパターンで処理されます。

  1. 画像の読み込み
  2. 画像のグレースケール化
  3. 画像の2値化

今回のサンプルコードでは閾値を127にしています。

グレースケールは0〜256階調の濃淡で表現されるので、2値化する際は閾値を定め、白と黒に振り分けます。

サンプルコード

import cv2
import numpy as np

file_cat = 'img/cat.jpg'

color = cv2.imread(file_cat , 1) 

#gray = cv2.cvtColor(file_cat, cv2.COLOR_BGR2GRAY) #グレースケール化
gray = cv2.imread(file_cat , 0) #グレースケール
height, width = gray.shape # 高さ・幅取得

thresh = 128 # 閾値

for i in range(height):
    for j in range(width):
        
        if gray[i][j] < thresh: # 閾値未満なら黒
            gray[i][j] = 0
            
        else: # 白色
            gray[i][j] = 255
 
while True:
    cv2.imshow("color", color) # ソース画像を表示
    
    k = cv2.waitKey(1)
    
    if k == ord('q'): # Qキーが押されたら終了
        break
        
cv2.destroyAllWindows()