LoginSignup
0
1

More than 1 year has passed since last update.

【前編】Pythonでカンタン画像解析~タピオカはいくつ?~ を手直ししてみた

Last updated at Posted at 2021-11-24

初投稿!

プログラム初心者なので、間違えてたらごめんなさい。

タイトルのサンプルコードが動いたのでメモがわりに(^ω^)

Pythonの画像処理をやってみようと思い、検索したらこちらの記事が目に入りました。

画像解析初心者でしたのでサンプルコードをそのままコピーしたのですが・・・。そもそもコンパイルエラー(´;ω;`)

何が悪かったのか、他の記事も検索してみました。

すると、初心者の私でも分かりやすい記事が!

(てか、画像解析触れたかっただけだから、これで終わりにすれば良かったなw)

この記事のサンプルコードをとりあえずコピー・・・(笑)

Image_processing_Experience.py
import cv2

filename = "tapioca_drink.png"
#挿入
img = cv2.imread(filename)

'''
#表示
cv2.imshow('OpenCV', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

#保存
#cv2.imwrite('save.png', img)
'''


#色空間の変換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  #BGR → グレースケール

'''
#表示
cv2.imshow('OpenCV', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
'''

#二値化処理
ret, thresh = cv2.threshold(gray, 127,255, cv2.THRESH_BINARY_INV)

'''
#表示
cv2.imshow('OpenCV', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
'''

#輪郭検出
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

#print(contours)

#輪郭描画
cv2.drawContours(img, contours, -1, (255, 0, 255), 3)

#表示
cv2.imshow('OpenCV', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像をタピオカドリンクに変えて実行!

タピオカドリンク結果_1.png

ストローまで数えてる(´・ω・`)

タピオカドリンクの記事にもありましたが、ストローの部分も濃い色であるため、単純な色の明るさだけだと検出できないらしいですね。

そしたら・・・。HSV使うかぁ(´;ω;`) (タピオカドリンクの記事を元にやっていきます。)

さてさて、とりあえず、いつも通り、サンプルコードをcontrol+c&control+v (コピー&ペースト) してと(笑)

tapioca_drink_sample2.py
from numpy import array, where, ones_like
from matplotlib import pyplot


## カラーで読み込んだ画像をcvtColorを用いてhsvに変更 ##
img_cl = imread('tapioca_drink.png', 6)
img_hsv = cvtColor(img_cl, COLOR_BGR2HSV)

## 赤色の範囲を定義 ##
hsv_min = array([150,  64,   0])
hsv_max = array([180, 255, 255])

## 赤色をマスクする ##   
mask = inRange(img_hsv, hsv_min, hsv_max)
mask = bitwise_not(mask)
img_hsv = bitwise_and(img_hsv, img_hsv, mask = mask)

## 背景の黒い部分などを白くする ##
img_hsv[:, :, 2] = where(img_hsv[:, :, 2] < 10, 255 * ones_like(img_hsv[:, :, 2]), img_hsv[:, :, 2])

## HSVからBGRを経由して白黒に変更する ##
img_bgr = cvtColor(img_hsv, COLOR_HSV2BGR)
img_bw  = cvtColor(img_bgr, COLOR_BGR2GRAY)

## ごみを取るためのブラシ処理 ##
img_bw_b = blur(img_bw, (3, 3))

## 暗い部分のみ残してみる ##
img_bw_b = where(img_bw_b < 90, 255, 0)
pyplot.imshow(img_bw_b)

・・・。まぁ、やっぱりできないか(´・ω・`)

【初心者向け】PythonとOpenCVで画像処理を体験してみよう の記事のおかげでちょっとは知識があったので、とりあえず、わかることは手直しっとw

Image_processing_Experience.py
#参照
#https://tech-blog.rakus.co.jp/entry/20201225/open-cv
#https://rightcode.co.jp/blog/information-technology/python-image-analysis-hsv-tapioca
#https://teratail.com/questions/307015

import cv2
import numpy
import matplotlib
import matplotlib.pyplot as plt


## カラーで読み込んだ画像をcvtColorを用いてhsvに変更 ##
img_cl = cv2.imread('tapioca_drink.png', 6)
img_hsv = cv2.cvtColor(img_cl, cv2.COLOR_BGR2HSV)

## 赤色の範囲を定義 ##
hsv_min = numpy.array([150,  64,   0])
hsv_max = numpy.array([180, 255, 255])

## 赤色をマスクする ##
mask = cv2.inRange(img_hsv, hsv_min, hsv_max)
mask = cv2.bitwise_not(mask)
img_hsv = cv2.bitwise_and(img_hsv, img_hsv, mask = mask)

## 背景の黒い部分などを白くする ##
img_hsv[:, :, 2] = numpy.where(img_hsv[:, :, 2] < 10, 255 * numpy.ones_like(img_hsv[:, :, 2]), img_hsv[:, :, 2])

## HSVからBGRを経由して白黒に変更する ##
img_bgr = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR)
img_bw  = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)

## ごみを取るためのブラシ処理 ##
img_bw_b = cv2.blur(img_bw, (3, 3))

## 暗い部分のみ残してみる ##
img_bw_b = numpy.where(img_bw_b < 90, 255, 0)
#cv2.imshow("test",img_bw_b)
cv2.imshow('marks',img_bw_b.astype(numpy.float32))
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.imwrite('save.png', img_bw_b)

インポートの部分を from から、 import に変えて、インポートしたものを使用するので、~.~ とやってみた。((cv2.imread)(numpy.ones)みたいに・・・。参照してるのかな・・・。)

すると・・・。

save.png

動いた!
☆.。.:(嬉´Д`嬉).。.:

そしたら、

上のソースコードの

Image_processing_Experience.py
import cv2
import numpy
import matplotlib
import matplotlib.pyplot as plt


## カラーで読み込んだ画像をcvtColorを用いてhsvに変更 ##
img_cl = cv2.imread('tapioca_drink.png', 6)
img_hsv = cv2.cvtColor(img_cl, cv2.COLOR_BGR2HSV)

## 赤色の範囲を定義 ##
hsv_min = numpy.array([150,  64,   0])
hsv_max = numpy.array([180, 255, 255])

## 赤色をマスクする ##
mask = cv2.inRange(img_hsv, hsv_min, hsv_max)
mask = cv2.bitwise_not(mask)
img_hsv = cv2.bitwise_and(img_hsv, img_hsv, mask = mask)

## 背景の黒い部分などを白くする ##
img_hsv[:, :, 2] = numpy.where(img_hsv[:, :, 2] < 10, 255 * numpy.ones_like(img_hsv[:, :, 2]), img_hsv[:, :, 2])

## HSVからBGRを経由して白黒に変更する ##
img_bgr = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR)
img_bw  = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)

## ごみを取るためのブラシ処理 ##
img_bw_b = cv2.blur(img_bw, (3, 3))

この部分と

【初心者向け】PythonとOpenCVで画像処理を体験してみよう
から

Image_processing_Experience.py
#二値化処理
ret, thresh = cv2.threshold(img_bw_b, 127,255, cv2.THRESH_BINARY_INV)

'''
#表示
cv2.imshow('OpenCV', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
'''

#輪郭検出
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

#輪郭描画
cv2.drawContours(img_cl, contours, -1, (255, 0, 255), 3)

#輪郭検出した数をカウント
print(len(contours))

#表示
cv2.imshow('OpenCV', img_cl)
cv2.waitKey(0)
cv2.destroyAllWindows()

この部分丸々コピー&ペーストしてっとw

Complete.py
#参照
#https://rightcode.co.jp/blog/information-technology/python-image-analysis-hsv-tapioca
#参照をなおす
#https://tech-blog.rakus.co.jp/entry/20201225/open-cv
#https://code-graffiti.com/opencv-lucas-kanade-optical-flow-in-python/
#https://note.nkmk.me/python-opencv-bgr-rgb-cvtcolor/
#https://teratail.com/questions/307015

#cv2.imread(filename, 6)
#https://weblabo.oscasierra.net/python/opencv-image.html

#画像
import cv2
#輪郭検出用
import numpy
from numpy import dtype, uint8
import matplotlib
import matplotlib.pyplot as plt

filename = "tapioca_drink.png"

## カラーで読み込んだ画像をcvtColorを用いてhsvに変更 ##
img_cl = cv2.imread(filename, cv2.IMREAD_COLOR)
img_hsv = cv2.cvtColor(img_cl, cv2.COLOR_BGR2HSV)

## 赤色の範囲を定義 ##
hsv_min = numpy.array([150,  64,   0])
hsv_max = numpy.array([180, 255, 255])

## 赤色をマスクする ##
mask = cv2.inRange(img_hsv, hsv_min, hsv_max)
mask = cv2.bitwise_not(mask)
img_hsv = cv2.bitwise_and(img_hsv, img_hsv, mask = mask)

## 背景の黒い部分などを白くする ##
img_hsv[:, :, 2] = numpy.where(img_hsv[:, :, 2] < 10, 255 * numpy.ones_like(img_hsv[:, :, 2]), img_hsv[:, :, 2])

## HSVからBGRを経由して白黒に変更する ##
img_bgr = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR)
img_bw  = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)

## ごみを取るためのブラシ処理 ##
img_bw_b = cv2.blur(img_bw, (4, 4))

#二値化処理
ret, thresh = cv2.threshold(img_bw_b, 127,255, cv2.THRESH_BINARY_INV)

'''
#表示
cv2.imshow('OpenCV', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
'''

#輪郭検出
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

#輪郭描画
cv2.drawContours(img_cl, contours, -1, (255, 0, 255), 3)

#輪郭検出した数をカウント
print(len(contours))

#表示
cv2.imshow('OpenCV', img_cl)
cv2.waitKey(0)
cv2.destroyAllWindows()

そして実行!

タピオカドリンク結果2.png

タピオカドリンク結果3.png

動いた ヤッター! (≧▽≦)

めっちゃ時間かかったw

ちょっと、やり方違うかもですが、とりあえず動いてよかった(⌒∇⌒)

わかりにくくってごめんなさい(´;ω;`)

参照元

参照をなおすために見た参照元

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1