opencv 形态学 *** 作腐蚀膨胀(01)

opencv 形态学 *** 作腐蚀膨胀(01),第1张

opencv 形态学 *** 作腐蚀/膨胀(01)

 腐蚀

	cv::namedWindow("src", cv::WINDOW_NORMAL);
	cv::namedWindow("copy", cv::WINDOW_NORMAL);
	cv::Mat src(cv::Size(200, 200), CV_8UC1, cv::Scalar(0));

	cv::rectangle(src, cv::Rect(30, 30, 9, 9), cv::Scalar(255), -1);

	cv::Mat	erode;
	cv::Mat kernel1 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(9, 9));
	morphologyEx(src, erode, cv::MORPH_ERODE, kernel1);

	std::vector> contours;
	cv::findContours(erode, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);

	cv::RotatedRect minRect = cv::minAreaRect(contours[0]);

	std::cout << "after erode size: " << minRect.boundingRect().tl() - cv::Point(30, 30) << std::endl;

	cv::Mat copy(src.size(), src.type(), cv::Scalar(0));
	copy.at(minRect.center) = 255;
	cv::circle(copy, minRect.center, 10, cv::Scalar(255), 1);

	cv::imshow("src", src);
	cv::imshow("copy", copy);
	cv::waitKey();

结果:

矩形大小为:(30, 30, 9, 9)

腐蚀核大小:(9, 9) 

 最后只剩下矩形的中心点(34, 34),其余全部腐蚀掉了。如下所示:

[[1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]]

[[0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 1 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]]
 膨胀
	cv::namedWindow("src", cv::WINDOW_NORMAL);
	cv::namedWindow("copy", cv::WINDOW_NORMAL);
	cv::Mat src(cv::Size(200, 200), CV_8UC1, cv::Scalar(0));
	src.at(cv::Point(34, 34)) = 255;
	//cv::rectangle(src, cv::Rect(30, 30, 9, 9), cv::Scalar(255), -1);

	cv::Mat	dilate;
	cv::Mat kernel1 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(9, 9));
	morphologyEx(src, dilate, cv::MORPH_DILATE, kernel1);

	std::vector> contours;
	cv::findContours(dilate, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);

	cv::RotatedRect minRect = cv::minAreaRect(contours[0]);
	std::cout << "Rect: " << minRect.boundingRect() << std::endl;
	std::cout << "after dilate size: " << minRect.boundingRect().tl() - cv::Point(30, 30) << std::endl;

	cv::Mat copy(src.size(), src.type(), cv::Scalar(0));
	cv::drawContours(copy, contours, -1, cv::Scalar(255), -1);

	cv::imshow("src", src);
	cv::imshow("copy", copy);
	cv::waitKey();

 结果

中心点坐标:(34, 34)

膨胀核大小:(9, 9)

 

 最后输出矩形(30, 30, 9, 9),如下所示:

[[0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 1 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]]     

[[1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1]]

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5699593.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存