我正在使用 OpenCV (C++),希望以最快的方式找到图像的骨架。
输入图像
hand_bw
为:
到目前为止,这就是我所拥有的:
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);
对应的输出为:
在 C++ 中实现此结果的最快方法是什么(可能是动态编程)?时间是我的主要限制。
您可以通过腐蚀连续层并记住“边缘”(即在上一次迭代中擦除的像素)来获得有效的解决方案。因此,您不必每次都处理整个图像,而是处理一个小得多的子集,使算法运行的时间与图像面积几乎成正比。
执行侵蚀过程时,保留像素,以便擦除它们会修改局部连通性。
我认为你应该开始使用像 MPI 库这样的并行编程