//主函数
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;
}
}
}