Search code examples
matlabopencvimage-processingcountimagej

Counting Regions of Interest in a Picture


I need to count the number of strips (as labeled) in the following photo: enter image description here

I have hundreds of photos that I need to analyze and I am curious if there is a way to automatically isolate the regions of interest and perform a simple count for each photo. I have little experience with image analysis and any advice to get me started would be greatly appreciated.


Solution

  • Please run the below code i have worked for you. Its approx close enough and tune it. Good Luck..!

    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <iostream>
    #include "tchar.h"
    using namespace cv;
    using namespace std;
    
    #define INPUT_FILE              "u.jpg"
    #define OUTPUT_FOLDER_PATH      string("")
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        Mat large = imread(INPUT_FILE);
        Mat rgb;
        // downsample and use it for processing
        pyrDown(large, rgb);
        Mat small;
        cvtColor(rgb, small, CV_BGR2GRAY);
        // morphological gradient
        Mat grad;
        Mat morphKernel = getStructuringElement(MORPH_ELLIPSE, Size(2, 2));
        Mat morphKernel1 = getStructuringElement(MORPH_ELLIPSE, Size(1, 1));
        morphologyEx(small, grad, MORPH_GRADIENT, morphKernel);
        // binarize
        Mat bw;
        threshold(grad, bw, 5.0, 50.0, THRESH_BINARY | THRESH_OTSU);
        // connect horizontally oriented regions
        Mat connected;
        morphKernel = getStructuringElement(MORPH_RECT, Size(5, 1));
        morphologyEx(bw, connected, MORPH_CLOSE, morphKernel);
        morphologyEx(bw, connected, MORPH_OPEN, morphKernel1);
        // find contours
        Mat mask = Mat::zeros(bw.size(), CV_8UC1);
        vector<vector<Point>> contours;
        vector<Vec4i> hierarchy;
        findContours(connected, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
        // filter contours
        int y=0;
        for(int idx = 0; idx >= 0; idx = hierarchy[idx][0])
        {
            Rect rect = boundingRect(contours[idx]);
            Mat maskROI(mask, rect);
            maskROI = Scalar(0, 0, 0);
            // fill the contour
            drawContours(mask, contours, idx, Scalar(255, 255, 255), CV_FILLED);
    
            double a=contourArea( contours[idx],false);
    
                if(a> 75)
    
            {
                rectangle(rgb, rect, Scalar(0, 255, 0), 2);
                y++;
            }
            imshow("Result1",rgb);
        }
        cout<<" The number of elements"<<y<< endl; 
        imshow("Result",mask);
        imwrite(OUTPUT_FOLDER_PATH + string("rgb.jpg"), rgb);
        waitKey(0);
        return 0;
    }
    

    enter image description here