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

初投稿！

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

タイトルのサンプルコードが動いたのでメモがわりに（＾ω＾）

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

https://rightcode.co.jp/blog/information-technology/python-image-analysis-hsv-tapioca

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

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

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

https://tech-blog.rakus.co.jp/entry/20201225/open-cv

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

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

```perl: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302042/15813dd7-2548-e1e4-0bd8-5460d2f47074.png)

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

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

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

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

```perl: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で画像処理を体験してみよう　の記事のおかげでちょっとは知識があったので、とりあえず、わかることは手直しっとｗ

```perl: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302042/81c6a311-9e9e-debc-a80e-e6bf21bda0fd.png)

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

そしたら、

上のソースコードの

```perl: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で画像処理を体験してみよう
から

```perl: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()
```
この部分丸々コピー&ペーストしてっとｗ

```perl: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302042/ef8e044f-4503-ddad-404a-330ebfbbaad2.png)

![タピオカドリンク結果3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302042/de69d2f9-a6c4-76ab-ab22-bbdd7b16bb47.png)

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

めっちゃ時間かかったｗ

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


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


参照元

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