Python : countNonZero白の数を数える(面積計測)

画像処理を使って、面積を計測する方法です。

OpenCVのcountNonZeroという方法を使います。

 

使い方としては簡単で、

whitePixels = cv2.countNonzero(指定の画像)という使い方をします。

注意としては、1チャンネルの画像(白黒画像)を使うということです。

 

プログラムの説明です。

まず、インポート、

OpenCVとnumpyでブランク画像も使うので、この2つです。

import numpy as np

iimport cv2

 

まずはBlank画像を作ります。

もちろん1チャンネル画像です。

 

面積を図りたいので、とりあえず半径50と75の円を書きます。

cv2.circle(blank,(250,250),50,(255,255,255),-1)

f:id:Kangkang1981:20200329211203j:plain
cv2.circle(blank,(250,250),75,(255,255,255),-1)

f:id:Kangkang1981:20200329211219j:plain

後はcountNonZeroにてピクセル数を数えます。

whitePixels = cv2.countNonZero(blank)

結果は

f:id:Kangkang1981:20200329211305j:plain

半径50のほうは7845、

半径75のほうは17665、

円の面積はπr2なので、

50 x 50 x 3.141593 = 7853.983

75 x 75 x 3.141593 = 17671.46

画像は点での描画となるので、ぴったりとはあいませんね。

拡大するとこんな感じですので、どうしても誤差は出てしまいます。

f:id:Kangkang1981:20200329212345p:plain

蛇足ですが、円周率ってどうやって計算するのだったか、

調べてみたら、「外接正多角形の外周 > 円周の長さ > 内接正多角形の外周」

という方法で計算しているのですね~

完全に忘れていたことですが、久々にこういうのを見ると実に楽しいです♪

円周率はこのリンク先にて見させていただきました。

 

面積を計測するプログラム詳細は下記です。

import numpy as np
import cv2

#blank画像を作成
blank = np.full((500, 500, 1), 0, dtype=np.uint8)

#半径50円を書く
cv2.circle(blank,(250,250),50,(255,255,255),-1)
#画像を保存
cv2.imwrite('radius_50.jpg',blank)
#白の数を数える。
whitePixels = cv2.countNonZero(blank)
#結果の表示
print(whitePixels)

#半径75の円を描く
cv2.circle(blank,(250,250),75,(255,255,255),-1)
#画像を保存
cv2.imwrite('radius_75.jpg',blank)
#白の数を数える
whitePixels = cv2.countNonZero(blank)
#結果の表示
print(whitePixels)

#キー入力を待つ
cv2.waitKey(0)
#全ての開いたウインドウ閉じる
cv2.destroyAllWindows()

 

今までにpythonについて書いた記事はここにリンクを貼ってあります。

興味があればぜひご覧ください。