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);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知来者逆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值