2013-03-30 41 views
6

Tôi có hình ảnh x-quang của bàn tay. Tôi cần phải tự động lấy xương. Tôi có thể dễ dàng phân đoạn một tay bằng các kỹ thuật khác nhau. Nhưng tôi cần lấy xương và sử dụng những kỹ thuật đó không giúp được gì. Một số xương là sáng hơn sau đó orthers, vì vậy nếu tôi sử dụng thresholding một số người trong số họ disapear trong khi những người khác trở thành rõ ràng tăng ngưỡng. Và tôi nghĩ rằng có lẽ tôi nên ngưỡng một khu vực của bàn tay chỉ? Có thể ngưỡng ROI không phải là một hình vuông không? O có lẽ bạn có bất kỳ giải pháp khác, lời khuyên? Có lẽ có một số thư viện như OpenCV hoặc một cái gì đó cho điều đó? Bất kỳ sự giúp đỡ nào sẽ rất tuyệt vời!Trích xuất xương tay từ hình ảnh X quang

Extended:

Raw Image Expected Output

                                  Raw ảnh                                             Dự kiến ​​Output

+0

Bạn có chắc chắn điều này liên quan đến việc xử lý? – Strawberry

+0

Thẻ không đúng. Lấy làm tiếc. – JuGi

+3

Có rất nhiều chương trình học tốt nghiệp trong tầm nhìn máy tính. – Jason

Trả lời

8

Một cách tiếp cận có thể là để phân khúc bàn tay và ngón tay từ hình ảnh:

enter image description here

Và sau đó tạo ra một hình ảnh chỉ với hình bóng tay:

enter image description here

Một khi bạn có hình bóng bạn có thể làm xói mòn hình ảnh để làm cho nó nhỏ hơn một chút . Này được sử dụng để trừ mặt từ tay & ngón tay ảnh, dẫn đến các ngón tay:

enter image description here

Đoạn code dưới đây cho thấy để thực hiện phương pháp này:

void detect_hand_and_fingers(cv::Mat& src); 
void detect_hand_silhoutte(cv::Mat& src); 

int main(int argc, char* argv[]) 
{ 
    cv::Mat img = cv::imread(argv[1]); 
    if (img.empty()) 
    { 
     std::cout << "!!! imread() failed to open target image" << std::endl; 
     return -1;   
    } 

    // Convert RGB Mat to GRAY 
    cv::Mat gray; 
    cv::cvtColor(img, gray, CV_BGR2GRAY); 
    cv::Mat gray_silhouette = gray.clone(); 

    /* Isolate Hand + Fingers */ 

    detect_hand_and_fingers(gray); 
    cv::imshow("Hand+Fingers", gray); 
    cv::imwrite("hand_fingers.png", gray); 

    /* Isolate Hand Sillhoute and subtract it from the other image (Hand+Fingers) */ 

    detect_hand_silhoutte(gray_silhouette); 
    cv::imshow("Hand", gray_silhouette); 
    cv::imwrite("hand_silhoutte.png", gray_silhouette); 

    /* Subtract Hand Silhoutte from Hand+Fingers so we get only Fingers */ 

    cv::Mat fingers = gray - gray_silhouette; 
    cv::imshow("Fingers", fingers); 
    cv::imwrite("fingers_only.png", fingers); 
    cv::waitKey(0); 

    return 0; 
} 

void detect_hand_and_fingers(cv::Mat& src) 
{   
    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3,3), cv::Point(1,1)); 
    cv::morphologyEx(src, src, cv::MORPH_ELLIPSE, kernel);  

    int adaptiveMethod = CV_ADAPTIVE_THRESH_GAUSSIAN_C; // CV_ADAPTIVE_THRESH_MEAN_C, CV_ADAPTIVE_THRESH_GAUSSIAN_C 
    cv::adaptiveThreshold(src, src, 255, 
          adaptiveMethod, CV_THRESH_BINARY, 
          9, -5); 

    int dilate_sz = 1; 
    cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, 
             cv::Size(2*dilate_sz, 2*dilate_sz), 
             cv::Point(dilate_sz, dilate_sz)); 
    cv::dilate(src, src, element); 
} 

void detect_hand_silhoutte(cv::Mat& src) 
{ 
    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(7, 7), cv::Point(3, 3)); 
    cv::morphologyEx(src, src, cv::MORPH_ELLIPSE, kernel);   

    int adaptiveMethod = CV_ADAPTIVE_THRESH_MEAN_C; // CV_ADAPTIVE_THRESH_MEAN_C, CV_ADAPTIVE_THRESH_GAUSSIAN_C 
    cv::adaptiveThreshold(src, src, 255, 
          adaptiveMethod, CV_THRESH_BINARY, 
          251, 5); // 251, 5 

    int erode_sz = 5; 
    cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, 
             cv::Size(2*erode_sz + 1, 2*erode_sz+1), 
             cv::Point(erode_sz, erode_sz)); 
    cv::erode(src, src, element); 

    int dilate_sz = 1; 
    element = cv::getStructuringElement(cv::MORPH_ELLIPSE, 
             cv::Size(2*dilate_sz + 1, 2*dilate_sz+1), 
             cv::Point(dilate_sz, dilate_sz)); 
    cv::dilate(src, src, element); 

    cv::bitwise_not(src, src); 
} 
Các vấn đề liên quan