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)
cv2.circle(blank,(250,250),75,(255,255,255),-1)
後はcountNonZeroにてピクセル数を数えます。
whitePixels = cv2.countNonZero(blank)
結果は
半径50のほうは7845、
半径75のほうは17665、
円の面積はπr2なので、
50 x 50 x 3.141593 = 7853.983
75 x 75 x 3.141593 = 17671.46
画像は点での描画となるので、ぴったりとはあいませんね。
拡大するとこんな感じですので、どうしても誤差は出てしまいます。
蛇足ですが、円周率ってどうやって計算するのだったか、
調べてみたら、「外接正多角形の外周 > 円周の長さ > 内接正多角形の外周」
という方法で計算しているのですね~
完全に忘れていたことですが、久々にこういうのを見ると実に楽しいです♪
円周率はこのリンク先にて見させていただきました。
面積を計測するプログラム詳細は下記です。
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について書いた記事はここにリンクを貼ってあります。
興味があればぜひご覧ください。