3値化した画像から、全体に対する白色・黒色・灰色の割合(面積比)を求める


1. 誰に向けた記事か
・pythonを勉強している人
・OpenCVに興味がある人
・画像処理に興味がある人
※初心者向けにpythonの勉強法とその手順を記事にしました。
www.stjun.com
2. はじめに
以前、画像のデータ構造を理解して画像の3値化を行いました。
www.stjun.com
今回、3値化した画像から白色・黒色・灰色の割合(面積比)を計算してみたいと思います。
なお2値化画像については過去記事をご覧ください。
www.stjun.com
www.stjun.com
3. コードと実行結果と説明
3.1 コード
import cv2
img=cv2.imread('./test.jpg',0)
cv2.imshow("original",img)
height,width=img.shape
th_low_value=100
th_high_value=150
gray=100
whole_area=img.size
white_area=0
black_area=0
gray_area=0
for i in range(height):
for j in range(width):
if img[i,j]<th_low_value:
img[i,j]=0
black_area+=1
elif th_low_value <= img[i,j] <=th_high_value:
img[i,j]=gray
gray_area+=1
else :
img[i,j]=255
white_area+=1
print('White_Area='+str(white_area/whole_area*100)+'%')
print('Black_Area='+str(black_area/whole_area*100)+'%')
print('Gray_Area='+str(gray_area/whole_area*100)+'%')
cv2.imshow("OpenCV",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
上記を実行すると冒頭の画像のように3値化画像と白色・黒色・灰色の面積割合が表示されます。
3.2 説明
3値化については過去記事(冒頭のリンク)で紹介したのでご覧ください。
新しく追加したのは次の部分です。
whole_area=img.size
white_area=0
black_area=0
gray_area=0
for i in range(height):
for j in range(width):
if img[i,j]<th_low_value:
img[i,j]=0
black_area+=1
elif th_low_value <= img[i,j] <=th_high_value:
img[i,j]=gray
gray_area+=1
else :
img[i,j]=255
white_area+=1
print('White_Area='+str(white_area/whole_area*100)+'%')
print('Black_Area='+str(black_area/whole_area*100)+'%')
print('Gray_Area='+str(gray_area/whole_area*100)+'%')
3.3 説明1:準備
whole_area=img.size
white_area=0
black_area=0
gray_area=0
後程、面積割合を出すための準備をします。
まず.sizeを使って画像全体の画素数を取得します。また白・黒・灰色の面積を計算するための変数white_area,black_area,gray_areaを設定します。初期値は0にしておきます。
3.3 説明2:3値化と面積比を求める
for i in range(height):
for j in range(width):
if img[i,j]<th_low_value:
img[i,j]=0
black_area+=1
elif th_low_value <= img[i,j] <=th_high_value:
img[i,j]=gray
gray_area+=1
else :
img[i,j]=255
white_area+=1
今回も、画素値が0~100なら黒、100~150は灰色、150~255は白に3値化します。またここで各色の画素数も数えていきます。
例えば元画素の値が60だとしましょう。100以下なのでimg[i,j]=0で画素値を0(=黒色)に上書きします。また1つの画素値が黒に上書きされたのでblack_area+=1でカウントしています。
これを全ての画素について行うと、白・黒・灰色の画素がそれぞれ何個あるかが分かります。
3.4 説明3:面積比を計算
print('White_Area='+str(white_area/whole_area*100)+'%')
print('Black_Area='+str(black_area/whole_area*100)+'%')
print('Gray_Area='+str(gray_area/whole_area*100)+'%')
あとは「各色の画素数 ÷ 全体の画素数」で割合を計算し、print()で表示します。
自分が使ってるお得情報の紹介
私はAmazon kindle unlimitedというサービスを1年以上利用しています。
これは月額980円で 和書12万冊以上の電子書籍を読めるサービスです。
ビジネス本、雑誌、漫画、技術本など様々な本を読むことができます。10冊まで端末にダウンロードできるのでネット環境がなくても(オフラインでも)見れます。
なおkindle unlimitedは最初の30日間無料のため、気軽に登録してみて、あまり読みたい本が無ければすぐに解約しても問題ありません。
それか30日内に気になる本を全て読破すれば実質タダです。
ぜひ気になった方はチェックしてみて下さい。
なおkindleにない本等を買う時はamazonギフト券(amazonで使えるポイント)を買い、ポイントで数冊まとめて買った方がお得です。
ギフト券(ポイント)は買ったら10年も有効で、ポイントが付きます。さらに本をまとめ買い(2冊以上同時に)買うと、ポイントがもらえます。
(https://www.amazon.co.jp/b?ie=UTF8&node=5431437051)
学生さんであればkindle unlimitedよりも年2450円(月210円程度)で映画見放題、音楽聞き放題、本読み放題の「prime student」がおすすめです。