機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

【python】【OpenCV】画像を3値化して各色の面積を求める

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

f:id:stjun:20200215223313p:plain

f:id:stjun:20200215223333p:plain

 

1. 誰に向けた記事か

pythonを勉強している人

OpenCVに興味がある人

・画像処理に興味がある人

※初心者向けにpythonの勉強法とその手順を記事にしました。

www.stjun.com

 

 

2. はじめに

以前、画像のデータ構造を理解して画像の3値化を行いました。

www.stjun.com

 今回、3値化した画像から白色・黒色・灰色の割合(面積比)を計算してみたいと思います。

なお2値化画像については過去記事をご覧ください。

www.stjun.com

www.stjun.com

 

3. コードと実行結果と説明

3.1 コード
#画像の3値化_ブログ
import cv2

#元画像の読み込み
img=cv2.imread('./test.jpg',0)
#元画像を表示
cv2.imshow("original",img)

#画像の縦の画素数、横の画素数を取得
height,width=img.shape

#3値化に使う低い側の閾値を決める
th_low_value=100
#3値化に使う高い側の閾値を決める
th_high_value=150
#3値化の白黒以外の色
gray=100
#全体の画素数
whole_area=img.size
#白の面積(初期=0)
white_area=0
#黒の面積(初期=0)
black_area=0
#灰色の面積(初期=0)
gray_area=0


#画像の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

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値化した画像の表示
cv2.imshow("OpenCV",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

上記を実行すると冒頭の画像のように3値化画像と白色・黒色・灰色の面積割合が表示されます。

 

3.2 説明

3値化については過去記事(冒頭のリンク)で紹介したのでご覧ください。

新しく追加したのは次の部分です。

#全体の画素数
whole_area=img.size
#白の面積(初期=0)
white_area=0
#黒の面積(初期=0)
black_area=0
#灰色の面積(初期=0)
gray_area=0


#画像の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

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
#白の面積(初期=0)
white_area=0
#黒の面積(初期=0)
black_area=0
#灰色の面積(初期=0)
gray_area=0

 後程、面積割合を出すための準備をします。

まず.sizeを使って画像全体の画素数を取得します。また白・黒・灰色の面積を計算するための変数white_area,black_area,gray_areaを設定します。初期値は0にしておきます。

 

3.3 説明2:3値化と面積比を求める
#画像の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」がおすすめです。