2016年11月14日 更新

OpenCVでライフサイエンスを加速する!

OpenCVはそもそもはコンピュータービジョン向けのライブラリです。それゆえ、顔認識や文字認識、カメラキャリブレーションなど、いわゆるロボットや自動運転車などの工学系の応用を主に想定して開発されていますが、ライフサイエンスの分野でもOpenCVは非常に役に立つツールです。

740 view お気に入り 0

私の運営するOpenCVの解説サイトである、「OpenCV画像解析入門」では、OpenCVを使った実践的な問題解決のためのコードを紹介しています。

今回はその中から、根の画像から、根の長さを主根と側根に分けて求める方法を紹介します。
根の長さを測定する | OpenCV画像解析入門 (2776)

輪郭の周の長さを求め、根量の指標とします。ここで輪郭長を1/2にすれば根の長さの総和を近似できるということが、根の細長いことから考えられます。この長さを推定根長和とします。OpenCVでは輪郭は点の集合として保持されます。findContours関数は2値画像を入力に使い、すべての輪郭、すなわち、すべての白と黒の境界線を検出します。
#include "opencv/cv.h"
#include "opencv/highgui.h"
#include <iostream>
using namespace cv;
using namespace std;
int main(){
    Mat img = imread("root.jpg", IMREAD_UNCHANGED);
    Mat gray_img;
    cvtColor(img, gray_img, CV_BGR2GRAY);
    Mat bin_img;
    threshold(gray_img, bin_img, 0, 255, THRESH_BINARY|THRESH_OTSU);
    bin_img = ~bin_img;
    Mat bin_img_copy=bin_img.clone(); //追加
    Mat element = Mat::ones(9,9,CV_8UC1); //追加
    vector<vector<Point> > contours;
    findContours(bin_img, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
    double contour_len=0;
    for(int i = 0; i < contours.size(); ++i) {
        contour_len += arcLength(contours.at(i),0);
    }
    cout<<"estimated root length (total) = "<<contour_len/2<<endl;
    
    erode(bin_img_copy, bin_img_copy, element, Point(-1,-1), 1);
    imshow("IMAGE_main_root",bin_img_copy);
    vector<vector<Point> > contours_main;
    findContours(bin_img_copy, contours_main, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
    double contour_len_main=0;
    for(int i = 0; i < contours_main.size(); ++i) {
        contour_len_main += arcLength(contours_main.at(i),0);
    }
    cout<<"estimated root length (main) = "<<contour_len_main/2<<endl;
    cout<<"estimated root length (lateral) = "<<(contour_len-contour_len_main)/2<<endl;
    
    waitKey(10000);
    return 0;
}
main.cpp
用意した根の写真では主根と側根の間に大きな太さの差があるため、根の部分を収縮させることで側根を消すことができます。細い根を消した2値画像、すなわち、主根のみの2値画像で同様に根長を求めれば主根の長さが求まります。収縮処理はerode関数により実装されています。コードでは側根も含めた合計の長さから主根の長さを引くことで側根の長さも求めています。

OpenCV画像解析入門では、特定の色のピクセルのカウントや、粒子のカウントトラッキングなど、他にも様々なOpenCVコードを紹介しています。空撮動画の解析なども扱っていますので是非ご覧ください!

24 件

関連する記事 こんな記事も人気です♪

画像の再構成理論〜概要、まとめ〜

画像の再構成理論〜概要、まとめ〜

今回は、以前4回にわたって記事として投稿した画像の再構成理論の概要について述べ、それのまとめをしたいと思います。
画像処理におけるフーリエ変換④〜pythonによるフィルタ設計〜

画像処理におけるフーリエ変換④〜pythonによるフィルタ設計〜

画像処理におけるフーリエ変換の最終回として、pythonによるフィルタ設定についてご紹介します。
pythonで学ぶOpenCV① 〜インストール、サンプルの実行〜

pythonで学ぶOpenCV① 〜インストール、サンプルの実行〜

pythonで学ぶOpenCVの第一回目についてご紹介します。
【Python講座6】Pythonで画像処理

【Python講座6】Pythonで画像処理

これまで勉強してきたPythonのスキルをベースに、画像処理についてやっていきたいと思います!
YoutubeでImageJ チュートリアル1 - インストール・セットアップ・プラグイン

YoutubeでImageJ チュートリアル1 - インストール・セットアップ・プラグイン

Fiji(ImageJにあらかじめ様々なプラグインがインストールされているもの)のインストールの仕方。新しいプラグインのインストールの方法を動画として紹介します。
北村 旭 | 269 view

この記事のキーワード

この記事のキュレーター

望月 優輝 望月 優輝