【OpenCV4】使用 filter2D() 函数实现基础的边缘检测

【OpenCV4】使用 filter2D() 函数实现基础的边缘检测,第1张

【OpenCV4】使用 filter2D() 函数实现基础的边缘检测 原理

在图像中边缘的地方,像素值会出现大幅的波动,这时候像素变化的导数增大,所以只要求一定范围内(比如滤波器范围内)像素值的变化程度即可。

测试代码
#include 
#include 

using namespace std;

int main()
{
	cv::Mat kernel_1 = (cv::Mat_(1, 2) << 1, -1); // 检测垂直边缘
	cv::Mat kernel_2 = (cv::Mat_(1, 3) << 1, 0, -1); // 检测垂直边缘
	cv::Mat kernel_3 = (cv::Mat_(3, 1) << 1, 0, -1); // 检测水平边缘
	cv::Mat kernel_RU = (cv::Mat_(2, 2) << 1, 0, 0, -1); // 右上到左下的边缘检测
	cv::Mat kernel_LU = (cv::Mat_(2, 2) << 0, -1, 1, 0); // 左上到右下的边缘检测

	// 显示滤波器形态
	cout << kernel_1 << endl;
	cout << kernel_2 << endl;
	cout << kernel_3 << endl;
	cout << kernel_RU << endl;
	cout << kernel_LU << endl;
	
	cv::Mat img = cv::imread("box.jpg", 0);
	if (img.empty())
	{
		cout << "Image read failed~" << endl;
		return;
	}
	cv::Mat result_1, result_2, result_3, result_4, result_5, result_6, result_7;

	cv::filter2D(img, result_1, CV_16S, kernel_1);
	cv::convertScaleAbs(result_1, result_1);

	cv::filter2D(img, result_2, CV_16S, kernel_2);
	cv::convertScaleAbs(result_2, result_2);

	cv::filter2D(img, result_3, CV_16S, kernel_3);
	cv::convertScaleAbs(result_3, result_3);

	// 把垂直和水平的边缘检测结果组合
	result_4 = result_2 + result_3;

	cv::filter2D(img, result_5, CV_16S, kernel_RU);
	cv::convertScaleAbs(result_5, result_5);

	cv::filter2D(img, result_6, CV_16S, kernel_LU);
	cv::convertScaleAbs(result_6, result_6);

	// 把两个斜向的边缘检测结果组合
	result_7 = result_5 + result_6;

	cv::imshow("vertical_1", result_1);
	cv::imshow("vertical_2", result_2);
	cv::imshow("horizontal", result_3);
	cv::imshow("combine_1", result_4);
	cv::imshow("right_up", result_5);
	cv::imshow("left_up", result_6);
	cv::imshow("combine_2", result_7);
	cv::waitKey(0);
	return 0;
}
测试图片

测试结果



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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存