区域生长的图片不完整
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);