OpenCV不规则ROI提取

提取不规则感兴趣区域

void anomalyRoi(Mat &src, Mat &dst)
{
	Mat original = src.clone();
	//高斯滤波
	GaussianBlur(original, original, Size(3, 3), 11, 11, 4);
	//灰度化
	cvtColor(original, original, COLOR_RGB2GRAY);
	//二值化
	Mat threshold_image;
	threshold(original, threshold_image, 90, 225, 3);

	//形态学操作,Size的第个值是水平方向,第二值是垂直方向
	Mat morphologyKernel = getStructuringElement(MORPH_RECT, Size(1, 3));
	//闭运算
	morphologyEx(threshold_image, threshold_image, CV_MOP_CLOSE, morphologyKernel);

	Canny(threshold_image, threshold_image, 45, 45 * 3);
	imshow("Canny", threshold_image);
	vector<vector<Point>> contours;
	vector<Vec4i> hireachy;

	//找轮廓
	findContours(threshold_image, contours, hireachy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, Point(-1, -1));
	int flag_count = 0;
	///vector< vector<Point>> contours_poly(contours.size());
	//建一个全黑的图像
	Mat show_threImage = Mat::zeros(threshold_image.size(), CV_8UC3);
	double s_area = 0;
	for (size_t i = 0; i < contours.size(); i++)
	{
		//在全黑的图像上画轮廓
		drawContours(show_threImage, contours, static_cast<int>(i), Scalar(255, 255, 255), 2, 8, hireachy, 0, Point()); 
		//利用面积进行判断是否为最大区域
		double area = contourArea(contours[i]);
		if (s_area < area)
		{
			s_area = area;
		}
		else
		{
			s_area = s_area;
		}

		if (area == s_area)
		{
			flag_count = static_cast<int>(i);
		}
		else
		{
			flag_count = flag_count;
		}
	}

	imshow("Draw_Image_Contours", show_threImage);

	Mat gray(src.size(), src.type(), Scalar(0, 0, 0));
	drawContours(gray, contours, flag_count, Scalar(255, 255, 255), 4, 8, hireachy, 0, Point());
	namedWindow("gray", 0);
	imshow("gray", gray);
	
	//为了找内部的一个漫水填充的种子点
	Rect s = boundingRect(contours[flag_count]);
	//黑色区域变成白色,遇到白色区域停止
	floodFill(gray, Point(s.x + s.width / 2, s.y + s.height / 2), Scalar(255,255,255));
	bitwise_and(src, gray, dst);
}
发布了79 篇原创文章 · 获赞 45 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/matt45m/article/details/102459768