zoukankan      html  css  js  c++  java
  • OpenCV学习(19) 细化算法(7)

    最后再来看一种通过形态学腐蚀和开操作得到骨架的方法。http://felix.abecassis.me/2011/09/opencv-morphological-skeleton/

    代码非常简单:

    void gThin::cvmorphThin(cv::Mat& src, cv::Mat& dst)
        {


        if(src.type()!=CV_8UC1)
            {
            printf("只能处理二值或灰度图像 ");
            return;
            }
       //非原地操作时候,copy src到dst
        if(dst.data!=src.data)
            {
            src.copyTo(dst);
            }

        cv::Mat skel(dst.size(), CV_8UC1, cv::Scalar(0));
        cv::Mat temp(dst.size(), CV_8UC1);

        cv::Mat element = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(3, 3));
        bool done;
        do
            {
            cv::morphologyEx(dst, temp, cv::MORPH_OPEN, element);
            cv::bitwise_not(temp, temp);
            cv::bitwise_and(dst, temp, temp);
            cv::bitwise_or(skel, temp, skel);
            cv::erode(dst, dst, element);

            double max;
            cv::minMaxLoc(dst, 0, &max);
            done = (max == 0);
            } while (!done);

            dst = skel;

        }

    算法原理如下,就是通过十字型结构元素开操作的的补集和当前像素相与来作为骨架。当图像腐蚀为全0时候,就得到了整个图像的骨架。

    img = ...;
    while (not_empty(img))
    {
        skel = skel | (img & !open(img));
        img = erosion(img);
    }

    image

    imageimage

    程序源代码:工程FirstOpenCV11

  • 相关阅读:
    解决验证码问题
    python中的偏函数partial
    Python 数据表orm设计
    参悟yield 和yield from (加精)
    numpy基础
    JS中的面向对象
    pandas使用教程
    一次tornado建站项目分享
    django 一对一, 一对多,多对多的领悟
    三维向量类
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/3329918.html
Copyright © 2011-2022 走看看