ど素人は忘れ易いのでメモ書き
環境
windous10 home(64bit)
anacondanavigator
Jupiternotebook
python3(3.7.7)
opencv(3.4.2)
やりたい事としては粒(粒子)の数を数えるプログラムを作成したい。
ちなみに初学者。
周囲に教えてくれる人はいないので独学。
おかしい箇所は多々あります。
参考文献
https://cvtech.cc/count/
C++用なのでpythonに合わせるのに苦労しました。
使用ライブラリ
import cv2
import sys
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
ぶっちゃけopencvとnumpyだけで事足りますが
自分の中でベーシックセットしてpandasとmatplotlibを足しているだけです。
img = cv2.imread('/seed.JPG',1)
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
上段はカウントしたい画像
下段はグレースケール化したもの。
読込時点で('/seed.JPG',0)
でもグレースケール化可能と思ったが
エラーが出たのであきらめてグレースケールを追加した。
size = (800,600)
img_resize = cv2.resize(img_gray,size)
使用画像のサイズが大きいのでリサイズしています。
(単に画面に収まらなかったから…)
画像サイズがそこまで大きくなければ全くいらないと思います。
#画像の高さ、幅を取得
h, w = img_resize.shape
#画像の前処理(拡大)
mag = 1
#画像の前処理(ぼかし)
img_blur = cv2.GaussianBlur(img_resize,(5,5),0)
#2値画像を取得
threshold = 50
ret,img_th = cv2.threshold(img_resize, threshold, 255, cv2.THRESH_BINARY)
#モルフォロジー変換(膨張)
kernel = np.ones((2,2),np.uint8)
img_th2 = cv2.dilate(img_th,kernel,)
#境界検出と描写
__, cut, __ = cv2.findContours(img_th2.astype(np.uint8),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
img_raw = cv2.resize(img,(w*mag, h*mag))
img_cut = cv2.drawContours(img_raw, cut, -1,(0,255,255),1)
print(len(cut))
参考の手順通りに行っていくと画像画像自体が大きくなりすぎて表示しきれなかったので
前処理部分はmag = 1
にしている(画像自体をリサイズしているから。)
2値化に関してはthreshold = 50
は処理画像を確認しながら自分で思う適切値にしている。
モルフォロジーと境界検出については正直半分も理解していないのが実情…orz
Udemyでの『opencvでの画像処理』講座を参考に何とか書き上げた感じ
print(len(cut))
はカウントしたarrayを表示させたいので追記。
結果は【475】
ここの部分はtkinter等で表示させる様にしたいが
全くわからんです。
cv2.imshow("cell",img_cut)
cv2.waitKey(0)
cv2.destroyAllWindows()
結果を表示。
ここまで来るのに滅茶苦茶苦労したが、何とか望みの画像を得る事が出来ました。
白黒がはっきりとしている画像に対しては問題なく行けるが
粒(粒子)以外に色味があるものに関してはうまくいかなかったので
色成分を抜いての2値化等を試して、絶賛挫折している最中です…( ゚Д゚)
tkinterとの組み合わせもしたいが全く知識ないので
覚える事が多くて…(ノД`)・゜・。
以上です。