Python,OpenCVで二値画像から白と黒の面積比を算出

プログラミング

はじめに

PythonとOpenCVを使って二値画像(白黒画像)の白と黒の面積比を算出する方法を実装。
ソースコードと計算結果を解説します。

二値化処理は画像処理で最も基本的な処理の一つで、色々なことに応用出来ます。
物体検出などは典型的な応用例ですので、興味ある方は下の記事も参考にしてみてください。

動作環境

・PyCharm Community Edition 2018.3.1 x64
・OpenCV 3.4.5.20

二値画像と二値化処理

二値画像とは、画像の色を二色(0:黒、1:白)で表した画像のことです。
ただし、一般的には256階調の画像では画素値0を黒、255を白と表します。

スポンサーリンク

白と黒の面積比計算

画像はピクセルの集まりなので、各ピクセルが黒か白かを調べてそれぞれの総和を計算します。

そして最終的な面積は画像全体のサイズで割ることで割合を算出します。

各ピクセルが0:黒ではない数を数えるのに便利な関数がOpenCVには実装されていて、それがcountNonZero()です。
この関数を使えばfor文でいちいち書かなくても良いので非常に便利です。

ソースコード

import cv2
import numpy as np

def calc_black_whiteArea(bw_image):
    image_size = bw_image.size
    whitePixels = cv2.countNonZero(bw_image)
    blackPixels = bw_image.size - whitePixels

    whiteAreaRatio = (whitePixels/image_size)*100#[%]
    blackAreaRatio = (blackPixels/image_size)*100#[%]

    print("White Area [%] : ", whiteAreaRatio)
    print("Black Area [%] : ", blackAreaRatio)


if __name__ == "__main__":
    # read input image
    image = cv2.imread("./lenna.jpg")

    # convert grayscale image
    gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

    # black white
    ret, bw_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_OTSU)

    # save image
    cv2.imwrite("black_white.jpg", bw_image)

    # calculation black and white area
    calc_black_whiteArea(bw_image)

 

結果

White Area [%]:50.62255859375
Black Area [%]:49.37744140625

入力画像(上)と出力画像(下)

書籍

①OpenCVを始めたい人向け
既存のライブラリを使ってとにかく画像処理を始めたい!という方は、下の本を参考にするのが良い。
少しお値段が張りますが、OpenCVのライブラリに関することはもちろんですが、コンピュータビジョンに関して体系的に書いてある良書です。


詳解 OpenCV 3 ―コンピュータビジョンライブラリを使った画像処理・認識

 

②ビギナー向け
コンピュータビジョンの基礎的なことから応用的なことまで、理論的に書かれています。
「画像処理、コンピュータビジョンって何?」というビギナーの方だけでなく、現役のエンジニアも一冊は手元に持っておくべき良書です。


ディジタル画像処理[改訂新版]

 

スポンサーリンク

コメント

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