円形の物体を認識して切り取る方法があることを知ったので、メモ。
準備編
OpenCVの準備
まずは、PythonからOpenCVを使えるようにする。
最近のAnaconda環境では、Python 3.6がインストールされるんだけれど、Python 3.6にインストールできるosx-64環境用のOpenCV3のconda パッケージが公開されていないので、Python 3.5環境を用意する。
とりあえず、condaで仮想環境を作っておいた。
conda create -n py35 python=3.5 anaconda
その後、source ~/.pyenv/versions/anaconda3-4.4.0/bin/activate py35
した後に、conda install --channel https://conda.anaconda.org/menpo opencv3
しておく。
サンプル画像の用意
ちょうど良い画像が手元になかったので、ImageJのサンプルをダウンロードして使う。
実装する
http://docs.opencv.org/3.1.0/da/d53/tutorial_py_houghcircles.html を参照しながら、実装してみる。
houghcircles_sample.py
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('img/embryos.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.medianBlur(gray, 5)
circles = cv2.HoughCircles(blur, cv2.HOUGH_GRADIENT,
dp=1, minDist=20, param1=50, param2=30,
minRadius=10, maxRadius=100)
circles = np.uint16(np.around(circles))
for (x, y, r) in circles[0]:
cv2.circle(img, (x, y), r, (0, 255, 0), 2)
cv2.circle(img, (x, y), 2, (0, 0, 255), 3)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
実行結果
なかなか悪くない。param1
とparam2
の調整次第では、ちゃんと細胞をカウントできそうだ。