画像を二値化して黒と白のピクセルを数える
やること
- ファイル名を指定して画像ファイルをグレースケールで読み出す
- グレースケール画像を平均化(ぼかし)処理する
- ぼかした画像を二値化し別ウィンドウに表示する
- キー入力で表示用ウィンドウを破棄し終了
使った関数
- cv2.imread : 画像ファイルの読み出し
第2引数にcv2.IMREAD_GRAYSCALE(または0)を指定することでグレースケール変換し読み出す - cv2.blur : 画像の平均化(ぼかし)処理。周囲の画素との輝度平均化処理がされる。
- cv2.threshold : 画像の閾値処理
- cv2.imshow : 画像を別ウィンドウに表示する
環境
準備
画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、"bricks.jpg"というファイル名で、jupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。
コード
import cv2 #OpenCVのインポート import numpy as np #numpyのインポート fname="bricks.jpg" #開く画像ファイル名 threshold=127 #二値化閾値 img_color= cv2.imread(fname) #画像を読み出しオブジェクトimg_colorに代入 img_gray = cv2.imread(fname,cv2.IMREAD_GRAYSCALE) #画像をグレースケールで読み出しオブジェクトimg_grayに代入 img_blur = cv2.blur(img_gray,(9,9)) #img_grayを平均化領域9x9で平均化処理しimg_blurに代入 ret, img_binary= cv2.threshold(img_blur, threshold, 255, cv2.THRESH_BINARY) #オブジェクトimg_blurを閾値threshold(127)で二値化しimg_binaryに代入 pixel_number = np.size(img_binary) #全ピクセル数をpixel_numberに代入 pixel_sum = np.sum(img_binary) #全ピクセルの輝度の合計をpixel_sumに代入 white_pixel_number = pixel_sum/255 #白いピクセルの数を計算しwhite_pixel_numberに代入 black_pixel_number = pixel_number - white_pixel_number #黒いピクセルの数を計算しwhite_pixel_numberに代入 print("全ピクセル数",pixel_number) #全ピクセル数を表示 print("輝度の合計値",pixel_sum) #輝度の合計値を表示 print("白いピクセルの数",white_pixel_number) #白いピクセルの数を表示 print("黒いピクセルの数",black_pixel_number) #黒いピクセルの数を表示 cv2.imshow("binary",img_binary) #別ウィンドウを開き(ウィンドウ名 "contours")オブジェクトimg_colorを表示 cv2.waitKey(0) #キー入力待ち cv2.destroyAllWindows() #ウインドウを閉じる
実行結果
以下のピクセル数集計結果が表示されます。
全ピクセル数 272640
輝度の合計値 51908055
白いピクセルの数 203561.0
黒いピクセルの数 69079.0
別ウィンドウが開き二値化された白黒画像が表示されます。何かキー入力するとウィンドウが閉じ、終了します。