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

问题描述 投票:0回答:2

我正在使用 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++ 中实现此结果的最快方法是什么(可能是动态编程)?时间是我的主要限制。

c++ opencv image-processing dynamic-programming opencv3.0
2个回答
3
投票

您可以通过腐蚀连续层并记住“边缘”(即在上一次迭代中擦除的像素)来获得有效的解决方案。因此,您不必每次都处理整个图像,而是处理一个小得多的子集,使算法运行的时间与图像面积几乎成正比。

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


0
投票

我认为你应该开始使用像 MPI 库这样的并行编程

© www.soinside.com 2019 - 2024. All rights reserved.