opencv区域生长不完整

区域生长的图片不完整

cv::Mat RegionGrow(const cv::Mat src, cv::Point2i pt, int th)
{
    cv::Point2i waitgrowing;                        //待生长点位置
    int ifgrow = 0;                                //标记是否生长过
    int startvalue = 0;                                //生长起点灰度值
    int nowvalue = 0;                                //当前生长点灰度值
    cv::Mat matDst = cv::Mat::zeros(src.size(), CV_8UC1);    //创建一个空白区域,填充为黑色
    //生长方向顺序数据
    int DIR[4][2] = { { -1 , 0 },  { 0 , -1 }, { 0 , 1 } , { 1 , 0 } };
    vector<cv::Point2i> growzhan;                      //生长点栈
    growzhan.push_back(pt);                            //将生长点压入栈中
    matDst.at<uchar>(pt.y, pt.x) = 255;                //标记生长点
    startvalue = src.at<uchar>(pt.y, pt.x);            //记录生长点的灰度值
    while (!growzhan.empty())                        //生长栈不为空则生长
    {
        pt = growzhan.back();                        //取出一个生长点
        growzhan.pop_back();
        //分别对4个方向上的点进行生长
        for (int i = 0; i<4; i++)
        {
            waitgrowing.x = pt.x + DIR[i][0];
            waitgrowing.y = pt.y + DIR[i][1];
            //检查是否是边缘点
            if (waitgrowing.x < 0 || waitgrowing.y < 0 || waitgrowing.x >(src.cols - 1) || waitgrowing.y > (src.rows - 1))
            {
                continue;
            }
            ifgrow = matDst.at<uchar>(waitgrowing.y, waitgrowing.x);        //当前待生长点的灰度值
            if (ifgrow == 0)                    //如果标记点还没有被生长
            {
                nowvalue = src.at<uchar>(waitgrowing.y, waitgrowing.x);
                if (abs(startvalue - nowvalue) < th)                    //在阈值范围内则生长
                {
                    matDst.at<uchar>(waitgrowing.y, waitgrowing.x) = 255;        //标记为白色 255
                    growzhan.push_back(waitgrowing);                    //将下一个生长点加入栈中
                }
            }
        }
    }
    return matDst;
}
```![图片说明](https://img-ask.csdn.net/upload/202009/21/1600701494_471144.jpg)
![图片说明](https://img-ask.csdn.net/upload/202009/21/1600701604_77044.jpg)
这是调用的程序:RegionGrow(image,cv::Point2i(30,170),70);

https://blog.csdn.net/qq_37764129/article/details/81227091

return matDst.clone;