图像八领域区域生长

//主函数
void Regiongrowing()
{
	CFileDialog dialog(TRUE, "image", "*.png", OFN_NOCHANGEDIR | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		_T(".data(*.png)|*.png||"), NULL);
	if (dialog.DoModal() != IDOK)
		return;
	string path_in = dialog.GetPathName();
	Mat srcImage = imread(path_in);
	Mat grayImage = Mat(srcImage.rows, srcImage.cols, CV_8UC1);
	Mat binImage = Mat(srcImage.rows, srcImage.cols, CV_8UC1);
	cvtColor(srcImage, grayImage, COLOR_RGB2GRAY);
	threshold(grayImage,binImage,100,255,THRESH_BINARY);

	RegionGrowingMethod(binImage);

	string path_out = path_in.substr(0, path_in.length() - 4) + "new.png";
	imwrite(path_out,binImage);
	cvNamedWindow("test", CV_WINDOW_NORMAL);
	imshow("test", binImage);
	waitKey(0);
}
void RegionGrowingMethod(Mat& srcImage)
{
	if (srcImage.channels() != 1)
	{
		return;
	}
	int Rows = srcImage.rows, Cols = srcImage.cols;
	//八领域的相对位置
	static Point connects[8] = { Point(-1, -1), Point(0, -1), Point(1, -1), Point(1, 0), Point(1, 1), Point(0, 1), Point(-1, 1), Point(-1, 0) };
	//Flag图像,用于表示原始图像中的点是否已经被遍历
	Mat Flagmat = Mat(srcImage.rows, srcImage.cols, CV_8UC1); //值为0表示已经被遍历
	//区域生长的结果
	vector<vector<Point>> Region;
	Region.clear();

	for (size_t i = 0; i < Rows; i++)
	{
		uchar* data_src = srcImage.ptr<uchar>(i);
		uchar* data_flag = Flagmat.ptr<uchar>(i);
		for (size_t j = 0; j < Cols; j++)
		{
			if (data_src[j] == 0)
			{
				data_flag[j] = 0;
			}
			else if (data_src[j] == 255 && data_flag[j] != 0)
			{
				vector<Point> Region_tmp;
				Region_tmp.clear();
				Region_tmp.push_back(Point(i, j));

				vector<Point> Region_flag;
				Region_flag.clear();
				Region_flag.push_back(Point(i, j));

				data_flag[j] = 0;

				while (Region_flag.size()>0)
				{
					for (size_t k = 0; k < 8; k++)
					{
						Point newPoint = Region_flag.at(0) + connects[k];
						if (newPoint.x >= 0 && newPoint.x < Rows && newPoint.y >= 0 && newPoint.y< Cols)
						{
							uchar* data_flag_new = Flagmat.ptr<uchar>(newPoint.x);
							uchar* data_src_new = srcImage.ptr<uchar>(newPoint.x);

							if (data_src_new[newPoint.y] == 255 && data_flag_new[newPoint.y] != 0)
							{
								Region_tmp.push_back(newPoint);
								Region_flag.push_back(newPoint);

							}
							data_flag_new[newPoint.y] = 0;
						}

					}
					Region_flag.erase(Region_flag.begin());
				}


				Region.push_back(Region_tmp);
			}
		}
	}

	//根据划分结果将不同的区域划设置为不同的颜色
	for (size_t i = 0; i < Region.size(); i++)
	{
		for (size_t j = 0; j < Region.at(i).size(); j++)
		{
			srcImage.at<uchar>(Region[i][j].x, Region[i][j].y) = (i + 1) * 64;
		}
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值