在CT图像中分割肺和结节

时间:2013-11-29 11:52:37

标签: matlab image-processing

我是Matlab中图像处理的新手,我试图从CT图像中分割LUNG和结节。我已经完成了初始图像增强。

我搜索了很多,但我没有找到任何相关材料。

尝试从给定图像中分割肺部分;然后检测肺部结节。

enter image description here

我在Matlab中尝试过的代码:

d1 = dicomread('000000.dcm'); 
d1ca = imadjust(d1); 

d1nF = wiener2(d1ca);

d1Level  = graythresh(d1nF);
d1sBW = im2bw(d1nF,d1Level); 
sed = strel('diamon',1); 
BWfinal = imerode(d1sBW,sed);
BWfinal = imerode(BWfinal,sed);

BWoutline = bwperim(BWfinal);
Segout = d1nF;
Segout(BWoutline) = 0; 

edgePrewitt = edge(d1nF,'prewitt'); 

上述代码的结果:

enter image description here

想要这样的结果:

http://oi41.tinypic.com/35me7pj.jpg

http://oi42.tinypic.com/2jbtk6p.jpg

http://oi44.tinypic.com/w0kthe.jpg

http://oi40.tinypic.com/nmfaio.jpg

http://oi41.tinypic.com/2nvdrie.jpg

http://oi43.tinypic.com/2nvdnhk.jpg

我知道专家可能很容易。请帮帮我。

谢谢!

2 个答案:

答案 0 :(得分:14)

以下不是Matlab的答案!然而, OpenCV Matlab 共享许多共同的功能,我相信你会能够毫无问题地将这个C ++代码翻译成Matlab。

有关被调用方法的更多信息,请查看OpenCV documentation

#include <iostream>
#include <vector>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>    

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);

灰度的内容如下:

// 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);

形态操作后的灰度是什么样的:

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

thres 的样子:

    // Find the contours of the lungs in the thresholded image
std::vector<std::vector<cv::Point> > 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<cv::Point> 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<cv::Vec4i>(), 0, cv::Point() );
    }           
}

肺部的样子:

// 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);

输出的内容如下:

此时,您的肺部已在图像中隔离,并可继续执行其他过滤操作以隔离结节。

祝你好运。

答案 1 :(得分:6)

试试这个:

% dp6BK.png is your original image, I downloaded directly
I = im2double(imread('dp6BK.png'));  
I=I(:,:,1);
imshow(I)


cropped = I(50:430,8:500); %% Crop region of interest   
thresholded = cropped < 0.35; %% Threshold to isolate lungs
clearThresh = imclearborder(thresholded); %% Remove border artifacts in image   
Liver = bwareaopen(clearThresh,100); %% Remove objects less than 100 pixels
Liver1 = imfill(Liver,'hole'); % fill in the vessels inside the lungs
figure,imshow(Liver1.*cropped)

你会得到什么:

enter image description here