hiyoko-programingの日記

プログラミングを勉強したてのひよっ子。   エンジニア目指して勉強中。

2値化

◉2値化とは?

画像には、暗い部分から明るい部分まであるが、

最も暗い部分を「0」、

最も明るい部分を「255」だとすると、

0〜255までの数字で様々な明るさを表現することができる。

この方法はグレースケールで、

今回は白と黒だけの2種類状態にする。

グレースケールよりさらに浮き上がらせるイメージ。

 

◉白と黒?

0〜255の間で「この辺りかな?」というところで、任意の線を決める。

例えば、100で線を引いたとする。

これを「閾値(しきいち)」と呼ぶ。

閾値より下を黒「0」、上を白「255」に変換する。

 

◉2値化を使う理由

対象物をより鮮明にでき、画像のノイズを除去することもできるため。

画像検出の前処理で使われることが多く、

また、最近では、車が車線からはみ出さないようにするアシスト機能にも

使われている。

 

◉2値化する方法

cv2.threshold(画像, 閾値, 最大値, 2値化の方法)

 ⚫︎画像:2値化したい画像

 ⚫︎閾値:任意の値

 ⚫︎最大値:閾値以上の場合は変換する明るさ

 ⚫︎2値化の方法:閾値以上の輝度を最大、以下の輝度を0にするコード「cv2.THRESH_BINARY」

 

 

<画像を2値化するPythonコード例>

import sys

import cv2

if len(sys.argv)<2:

    print('表示したいファイル名を指定してください。')

    sys.exit()

file = sys.argv[1]

try:

    img = cv2.imread( ' file ' ) 

    if img is None:

         raise ValueError('ファイルが見つかりません')

    img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

    retValue, img_thresh = cv2.threshold(img_gray, 100, 200, cv2.THRESH_BINARY)

    cv2.imshow(file, img_thresh)

    cv2.waitKey(0)

    cv2.destroyAllWindows()

except ValueError as e:

    print(e)

except:

    import traceback

    traceback.print_exc()

 

 

 

単純2値化では処理こそ単純だが、処理後の画像に滑らかさは無くなる。

元画像
単純2値化