二値化し、面積を求める

例えば、根の写真をもとに、根の量がどれくらいあるのかを最も簡単に調べる方法として、画像における根の占める面積が挙げられます。ここでは、画像を白黒画像に変換してから黒い部分の面積を求めるプログラムを紹介します。白黒画像にするにあたり、はじめにカラー画像をcvtColor関数によりグレースケールに変換します。それをthreshold関数により二値化します。続いて白黒画像の各画素にアクセスして白なのか黒なのかを取得していきます。最後に画素値が0、すなわち黒であった画素の数の合計を表示します。

root root_bin

ソースコード

このソースコードはGNU GPLライセンスにより保護されています。GNU GPLライセンスの条項に関してはこちらをご覧ください。

//
//  area
//
//  Copyright 2015 Yuki Mochizuki
//

#include <iostream>
#include <stdio.h>
#include "opencv/cv.h"
#include "opencv/highgui.h"
#include <cmath>

using namespace std;
using namespace cv;



int main()
{
    Mat src_img = imread("/Users/YM/Desktop/root.jpg");

    Mat gray_img;
    cvtColor(src_img, gray_img, CV_BGR2GRAY);
    
    Mat bin_img;
    threshold(gray_img, bin_img, 0, 255, THRESH_BINARY|THRESH_OTSU);
    
    cvNamedWindow("src", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("gray", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("bin", CV_WINDOW_AUTOSIZE);
    
    cv::imshow("src", src_img);
    cv::imshow("gray", gray_img);
    cv::imshow("bin", bin_img);
    
    int s=0;
    
    for(int y = 0; y < bin_img.rows; ++y){
        for(int x = 0; x < bin_img.cols; ++x){
            for(int c = 0; c < bin_img.channels(); ++c){
                if(bin_img.data[ y * bin_img.step + x * bin_img.elemSize() + c ]==0)s++;
            }
        }
    }
    
    cout<<s<<" pixel/ "<<bin_img.rows*bin_img.cols<<" pixel ("<<(double)s/bin_img.rows/bin_img.cols*100<<" %)"<<endl;
    cvWaitKey(0);
}