【水耕栽培】画像にうつっている豆苗の面積を求めます!
※この記事は活動をちらっと紹介することが目的です。そのため、プログラム等を載せたものとはなっていません(ごめんなさい!)。
また、筆者は独学の初心者なので、もし誤り等があればkaturadafarmアットマークgmail.comまで伝えてくれるとありがたいです!!
こんにちは。桂田社長の右腕の兼田です。
昨日今日と連続で怒涛の水耕栽培ブームですが、これまでに書いてきた水耕栽培関連の記事は以下のようなものがあります。
↑1記事目
↑2記事目
↑3記事目
1記事目はだいぶ昔になってしまうのですが、水を循環させるためにコンテナボックスに穴をあけていました。せっかく開けたのですが、3記事目にある通り今はコンテナボックスは使っていません。
現在、豆苗を小さな容器で育てています。そして、Raspberry Piと温度センサー、定点カメラを1時間に1回動かす形でテストしています。(3記事目)
温度センサーはその名のとおり室温を測ってくれるのですが、定期的に室温を測っているのなら、その時の豆苗の成長率も分かっておきたいものです。
そこで、以前農園で使っていた定点カメラで写真を撮り、OpenCVというもので豆苗の面積を出力できるように処理します。
OpenCVとは、画像や動画の処理を得意とするライブラリ(ライブラリ:便利なプログラムを集めたファイルのようなもの)です。具体的には、画像に線やテキストを描画したり、物体の検出、物体の追跡、フィルター処理、機械学習などの機能があります。
実際にOpenCVが使われている例をいくつか紹介します。
下のリンクは、株式会社One Technology Japanさんのクーポンアプリです。
看板を読み取ると、位置を特定してクーポン券やWEBサイトを表示できます。(リンク先のYouTubeの動画が分かりやすいです)
また、Google Scholarで「白線検出 OpenCV」や「車両検出 OpenCV」などと調べると、最近噂の自動運転で歩行者や白線、車両などを検出する画像処理をする時にOpenCVを使う方法が提案されているそうです。
他にも、顔認識などにも使われていると思います。
そんなOpenCVですが、今回は撮影した豆苗の画像を読み取り、緑色の部分だけに注目してその面積を計算させます。
どうやって実現するか、簡単に説明しますね。
「緑色に注目する」ということでしたが、色の見え方は人によって違うので、色を定量的に表す方法が必要です。いくつかあるのですが、中でも色空間は座標で色を指定することができます。
デジタルカメラやディスプレイなどでは、RGB色空間で色を表現しています。赤 (Red)、緑 (Green)、青 (Blue) の三つの原色を混ぜて幅広い色を再現しているのです。
R、G、Bの各要素の割合を、0から255までの数字(明度?)で表すことが出来ます。それぞれの数値を調整して、例えば「青みがかった緑」とかを表すわけです。
↑このような図を見かけたことがあるかもしれません。
次に、HSV色空間というものがあります。HSV 色空間は、色相(Hue)、彩度(Saturation)、明度(Value)の 3 要素で色を表しています。
色相とは、赤とか青とかの色を表します。彩度は色の鮮やかさ、明度は明るさです。色相は0≤H≤360で表し(色相は環状になっているので)、彩度は0≤S≤100(0%から100%)、明度も0≤V≤100(0%から100%)で表します。
写真は一般にRGB色空間で記録されていますが、今回は撮った写真をRGB色空間からHSV色空間に変換します。こうすることで何が良いかというと、色を一つのパラメータだけで調整できるようになるのです。
「緑色に注目する」ということでしたが、原色を組み合わせるRGB色空間は、前述したとおり「青みがかった緑」などを表現するときにRとGとBの3つの数値をいじらなければいけないのです。それに対してHSV色空間は、色相のみで色を表すことが出来るので、RGB色空間より効率がよいというわけです。
ということで、手順として最初にOpenCVで「画像を RGB色空間からHSV色空間に変換」します。
次に、色空間を変換した画像の、「緑色の部分に注目」します。
注目を具体的に言うと、画像を2値化するのです。2値化とは、今回の場合、HSV色空間のHの値について範囲を定めて、その範囲内の色を白、範囲外の色は全て黒に変換し、画像を上書きすることです。
今回は、その範囲を大体50 ≤ H ≤ 150とします。Hは全部の色で 0 ≤ H ≤ 360 の値を取りますが、50から150の範囲は緑色を示します。「大体」なのは、写真の写り方等でうまくいかなかったとき、範囲を広げたり狭めたりするからです。
文章ばかりでは分かりにくいと思います。実際に2値化前の画像と、2値化後の画像を貼りますね。
↑2値化前の豆苗の写真。
↑2値化後の写真。緑色だった部分が白色に、そのほかは黒色になっています。
「2値化する」とは、こんな感じのことを言います。
後は、この白色の部分の面積を計算します。面積といっても、単位は普段使うような「平方センチメートル」などではなく、ピクセル(コンピュータで画像を扱うときの色情報を持つ最小単位)です。
2値化した画像のピクセルを数えるプログラムを実行すると、
このようになりました。
値が上下で2つありますが、実はこれは、ピクセルを数える方法が2つあったのです。ただ、ここは僕の勉強不足なのですが、2つの方法のうちどちらが正確かわかっていません…。実際に何度か試してみたり、調べたりしてまた勉強しようと思います。
とりあえず、このような感じで豆苗の面積を求めました。豆苗が成長する度、この面積が増えていくので、豆苗の成長を数値化できるようになったのです。
また、成長した場所も分かるので日々観察していると豆苗がどのように成長しているのかも把握しやすくなります。
桂田農園に来てくださり、ありがとうございます。ある程度温度と写真のデータが溜まったら、一度グラフにまとめたいです。
今回は比較的簡単な方法で面積を求めましたが、まだまだ効率であったり、正確さなどを向上できると思います。
0コメント