原理
在图像中边缘的地方,像素值会出现大幅的波动,这时候像素变化的导数增大,所以只要求一定范围内(比如滤波器范围内)像素值的变化程度即可。
测试代码
#include <opencv\opencv.hpp>
#include <iostream>
using namespace std;
int main()
{
cv::Mat kernel_1 = (cv::Mat_<float>(1, 2) << 1, -1); // 检测垂直边缘
cv::Mat kernel_2 = (cv::Mat_<float>(1, 3) << 1, 0, -1); // 检测垂直边缘
cv::Mat kernel_3 = (cv::Mat_<float>(3, 1) << 1, 0, -1); // 检测水平边缘
cv::Mat kernel_RU = (cv::Mat_<float>(2, 2) << 1, 0, 0, -1); // 右上到左下的边缘检测
cv::Mat kernel_LU = (cv::Mat_<float>(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;
}
测试图片
测试结果