Segmenting Lungs and nodules in CT images

后端 未结 2 763
轻奢々
轻奢々 2020-12-08 17:14

I am new with Image processing in Matlab, I am trying to segment LUNG and nodules from CT image. I have done initial image enhancement.

I searched lot on the same bu

2条回答
  •  时光说笑
    2020-12-08 17:59

    The following is not a Matlab answer! However, OpenCV and Matlab share many features in common, and I'm sure you will be able to translate this C++ code to Matlab with no problems.

    For more information about the methods being called, check the OpenCV documentation.

    #include 
    #include 
    #include 
    #include     
    
    int main(int argc, char* argv[])
    {
    // Load input image (colored, i.e. 3-channel)
    cv::Mat input = cv::imread(argv[1]);
    if (input.empty())
    {
        std::cout << "!!! failed imread()" << std::endl;
        return -1;
    }   
    
    // Convert input image to grayscale (1-channel)
    cv::Mat grayscale = input.clone();
    cv::cvtColor(input, grayscale, cv::COLOR_BGR2GRAY);
    

    What grayscale looks like:

    // Erode & Dilate to remove noises and improve the result of the next operation (threshold)
    int erosion_type = cv::MORPH_RECT; // MORPH_RECT, MORPH_CROSS, MORPH_ELLIPSE
    int erosion_size = 3;
    cv::Mat element = cv::getStructuringElement(erosion_type, 
                                                cv::Size(2 * erosion_size + 1, 2 * erosion_size + 1), 
                                                cv::Point(erosion_size, erosion_size));
    
    cv::erode(grayscale, grayscale, element);
    cv::dilate(grayscale, grayscale, element);
    

    What grayscale looks like after morphological operations:

    // Threshold to segment the area of the lungs
    cv::Mat thres;
    cv::threshold(grayscale, thres, 80, 150, cv::THRESH_BINARY);
    

    What thres looks like:

        // Find the contours of the lungs in the thresholded image
    std::vector > contours;
    cv::findContours(thres, contours, cv::RETR_LIST, cv::CHAIN_APPROX_SIMPLE);
    
    
    // Fill the areas of the lungs with BLUE for better visualization   
    cv::Mat lungs = input.clone();      
    for (size_t i = 0; i < contours.size(); i++)
    {
        std::vector cnt = contours[i];
        double area = cv::contourArea(cv::Mat(cnt));        
    
        if (area > 15000 && area < 35000)
        {
            std::cout << "* Area: " << area << std::endl;
            cv::drawContours(lungs, contours, i, cv::Scalar(255, 0, 0), 
                             CV_FILLED, 8, std::vector(), 0, cv::Point() );
        }           
    }
    

    What lungs looks like:

    // Using the image with blue lungs as a mask, we create a new image containing only the lungs
    cv::Mat blue_mask = cv::Mat::zeros(input.size(), CV_8UC1);
    cv::inRange(lungs, cv::Scalar(255, 0, 0), cv::Scalar(255, 0, 0), blue_mask);    
    cv::Mat output;
    input.copyTo(output, blue_mask);
    

    What output looks like:

    At this point you have the lungs isolated in the image and can proceed to execute other filter operations to isolate the nodules.

    Good luck.

提交回复
热议问题