2016-12-30 4 views
2

Ich habe dieses Bild: enter image description hereOpenCV Dilation und Skeleton (C++)

Und ich angelegt Dilatation mit diesem Code:

int dilation_elem = 0; 
int dilation_size = 0; 
int const max_elem = 2; 
int const max_kernel_size = 21; 


void Dilation(int, void*); 

int main(int argc, char** argv) 
{ 

    src = imread("a18.png"); 

    if(!src.data) 
    { return -1; } 

    namedWindow("Dilation Demo", CV_WINDOW_AUTOSIZE); 
    cvMoveWindow("Dilation Demo", src.cols, 0); 

    createTrackbar("Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Dilation Demo", 
        &dilation_elem, max_elem, 
        Dilation); 

    createTrackbar("Kernel size:\n 2n +1", "Dilation Demo", 
        &dilation_size, max_kernel_size, 
        Dilation); 
//int dilation_size =7; 
    /// Default start 

    Dilation(0, 0); 

    waitKey(0); 
    return 0; 
} 

void Dilation(int, void*) 
{ 
    int dilation_type; 
    if(dilation_elem == 0){ dilation_type = MORPH_RECT; } 
    else if(dilation_elem == 1){ dilation_type = MORPH_CROSS; } 
    else if(dilation_elem == 2) { dilation_type = MORPH_ELLIPSE; } 

    Mat element = getStructuringElement(dilation_type, 
             Size(2*dilation_size + 1, 2*dilation_size+1), 
             Point(dilation_size, dilation_size)); 

    dilate(src, dilation_dst, element); 
    imshow("Dilation Demo", dilation_dst); 
    imwrite("a18d.png",dilation_dst); 
} 

Und nach diesem Schritt erhalte ich diese konsequente: enter image description here

Und der letzte Schritt ist das Skelett:

#include <iostream> 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
int main() 
{ 
    cv::Mat img = cv::imread("a18d.png", 0); 
cv::threshold(img, img, 127, 255, cv::THRESH_BINARY); 
cv::Mat skel(img.size(), CV_8UC1, cv::Scalar(0)); 
cv::Mat temp; 
cv::Mat eroded; 

cv::Mat element = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(3,3)); 

bool done;  
do 
{ 
    cv::erode(img, eroded, element); 
    cv::dilate(eroded, temp, element); // temp = open(img) 
    cv::subtract(img, temp, temp); 
    cv::bitwise_or(skel, temp, skel); 
    eroded.copyTo(img); 

    done = (cv::countNonZero(img) == 0); 
} while (!done); 
cv::imshow("Skeleton", skel); 
cv::imwrite("18s.png",skel); 
cv::waitKey(0); 

    return 0; 
} 

Code hier

Und ich hve dieses Bild: enter image description here

Aber ich will Bild wie folgt aus: enter image description here

Was kann ich dafür tun? Was ist das Problem diese Schritte wurde für Bild 4 getan und das Ergebnis ist gut

+0

Bitte den Skelettierungscode posten. Momentan haben Sie den Dilationscode zweimal kopiert, so dass wir nicht schnell ankommen werden. –

+0

Sie können auch hier für Skelett-Code überprüfen: http://StackOverflow.com/Questions/22058485/How-to-Implement-an-Function-Equivalent-To-Bwmorph-matlab-Function-in-opencv/22060992#22060992 –

+0

Vielen Dank, eigentlich ist Ihre Methode besser Mein neues Ergebnis ist hier http://i.resimyukle.xyz/cyNL.png aber Bild hat über jeden Rat für dieses Problem –

Antwort