map)を計算する距離マップの極大値をもつ場所を計算する膨張させ、輪郭検出し、数える今回はPythonで細胞数のカウントをしてみます。C++での粒子カウントを解説したものはこちらになります。1)の最後の1はカラーで読み込むことを表します。ここを0にするとグレースケールで読み込まれます。元画像は3チャンネル(BGR)の画像なので、チャンネルを分離します。OpenCVのsplit関数を使います。NumPyでは3チャンネルがBGRの順に並ぶため、例えば、今回は核の情報を元にカウントを行いますので、赤を表示する時には012のうちの2を指定します。#赤を表示plt.colorbar()plt.show()2値化する赤のチャンネルを元に、2値化を行います。閾値を100にして、2値化を行いますが、今回はOpenCVの関数を使わずにNumPyの機能で2値化を行います。することで、条件を満たすピクセルのみが1になった2値画像が得られます。distanceTransform関数は決まった型のNumPy配列しか受け取らないので、binimg.astype(np.uint8)というようにnp.uint8型に変換しています。8bitを意味しており、符号なし8ビット整数、すなわち、0~255の整数を保持する型になります。cv2.distanceTransform(binimg,1,3)plt.imshow(distmap)plt.colorbar()plt.show()わかりにくいので、一部のみを拡大して表示します。下のコードは0<x<100,0<y<100の正方形領域を抜き出して描画しています。このように、核の輪郭から遠い部分で高い値をもつ画像が得られることになります。plt.imshow(distmap[0:100,0:100])plt.colorbar()plt.show()距離マップの極大値をもつ場所を計算する極大の計算に関数を用いてもいいのですが、今回は簡単に、「極大=周辺の20*20ピクセルの領域のどこよりも値が大きい場所」ということにして、計算してみます。plt.imshow(out[0:100,0:100])plt.colorbar()plt.show()膨張させ、輪郭検出し、数えるここまでで極大値をもつピクセルを検出してきましたが、ちょうど同じ値のピクセルが近くにある可能性は否定できません。そこで、dilate関数によって膨張処理を施し、もし近くに同じ極大値をもつピクセルがあった場合には1つの塊としてまとめてしまいます。dilate関数は第二引数に、カーネルの大きさを指定します。今回は3*3の大きさのカーネルを指定しており、値が0でない各点は3*3マスの大きさに膨張します。膨張処理の後、findContours関数によって輪郭検出を行います。この関数は決まった型のNumPy配列しか受け取らないので、out.astype(np.uint8)というようにnp.uint8型に変換しています。輪郭検出の後は、各輪郭について、輪郭構成点の重心を求め、核の座標としてリストarrに追加しています。np.array(arr)によってリストをNumPy配列に変換していますが、今回は特に必ずすべきという処理ではありません。10]]と表示されました。個数は399個で、その座標が続いて順に出力されます。トラッキングにしても最初は各フレームから対象の座標を取り出さなくてはなりませんので、このような粒子カウントは、画像解析をする上できっと役に立つものだと思っています。応用編ツイートシェアはてブGoogle+Pocketfeedlyt_fujiOpenCV初心者です。こちらのサイトで、これから勉強して行きます。最後のサンプルですが、エラーが出て進みませんでした。環境は、Mac/Python3です。cv2.CHAIN_APPROX_NONE)print(len(arr))print(arr)初歩的な質問かも知れませんが宜しく御願いします。MochizukiPythonのバージョンではなくOpenCVのバージョンによって少し違います。2.xと3.xで少し違っていて、返り値の数が違います。_で受けるかの違いが出てくるようになっています。使っているOpenCVのバージョンはprint(cv2.__version__)で確認できます。cv2なので少しややこしいですね。あやこpython初心者の大学2年です。pythonで細胞の数を数える方法はないかと困っていたところ、このサイトに出会えました。解説も分かりやすく、とても役に立ちました、ありがとうございます。白黒画像,背景が黒,白い細胞をカウントしたい場合はどのようにコードを変更したら良いでしょうか?返信お待ちしております。二次元配列の初期化Pythonの基本RECOMMENDこちらの記事も人気です。:ピクシーダストテクノロジーズ株式会社で主に画像処理の研究開発をやっています。