用C ++计算图像骨架的最快方法

时间:2018-04-23 14:57:06

标签: c++ opencv image-processing dynamic-programming opencv3.0

我正在使用OpenCV(C ++),并希望以最快的方式找到图像的骨架。

输入图片hand_bw为:

enter image description here

截至目前,这就是我所拥有的:

cv::Mat skel(hand_bw.size(), CV_8UC1, cv::Scalar(0));
cv::Mat temp(hand_bw.size(), CV_8UC1);
cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3));
bool done; 
int i = 0;
do
{
    cv::morphologyEx(hand_bw, temp, cv::MORPH_OPEN, element);
    cv::bitwise_not(temp, temp);
    cv::bitwise_and(hand_bw, temp, temp);
    cv::bitwise_or(skel, temp, skel);
    cv::erode(hand_bw, hand_bw, element);
    double max;
    cv::minMaxLoc(hand_bw, 0, &max);
    done = (max == 0);
    i = i+1;
} while (!done);
cv::imshow("Skeleton", skel); 

相应的输出是:

enter image description here

在C ++中实现此结果的最快方法是什么(可能是动态编程)?时间是我的主要制约因素。

1 个答案:

答案 0 :(得分:3)

您可以通过侵蚀连续的图层并记住“条纹”(即在前一次迭代中擦除的像素)来获得有效的解决方案。因此,不是每次处理整个图像,而是处理一个小得多的子集,使算法在时间上与图像区域成正比。

当执行侵蚀过程时,保留像素以便擦除它们会修改局部连通性。