Sobel边缘检测的OpenCV实现

Sobel边缘检测的OpenCV实现

  • 方式1:直接调用Sobel函数实现
  • 方式2:根据Sobel模板实现边缘检测
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;
static string winName = "Sobel边缘检测图像";

void on_trackbar(int threshold, void* usrdata)
{
	Mat src = *(Mat*)(usrdata);
	Mat dst(src.rows, src.cols, CV_8UC1, Scalar(0));
	for (int i = 1; i < src.rows - 1; ++i)
	{
		uchar *p = dst.ptr<uchar>(i);
		uchar *p1 = src.ptr<uchar>(i - 1);
		uchar *p2 = src.ptr<uchar>(i);
		uchar *p3 = src.ptr<uchar>(i + 1);
		for (int j = 1; j < src.cols - 1; ++j)
		{
			int gx = p1[j - 1] * (-1) + p2[j - 1] * (-2) + p3[j - 1] * (-1)
				+ p1[j + 1] + p2[j + 1] * 2 + p3[j + 1];
			int gy = p3[j - 1] * (-1) + p3[j] * (-2) + p3[j + 1] * (-1)
				+ p1[j - 1] + p1[j] * 2 + p1[j + 1];
			int grad = sqrt(gx*gx + gy*gy);
			if (grad > threshold)
			{
				p[j] = 255;
			}
		}
	}
	imshow(winName, dst);
}

int main(void)
{
	Mat src = imread("lena512.bmp");	
	int threshold = 128;
	cvtColor(src, src, CV_BGR2GRAY);
	imshow("原始图像", src);

	// 1. sobel函数
	//Mat dst(src.rows, src.cols, CV_8UC1, Scalar(0));
	//Sobel(src, dst, -1, 1, 0, 3, 1, 0, BORDER_DEFAULT);
	//Sobel(dst, dst, -1, 0, 1, 3, 1, 0, BORDER_DEFAULT);
	//imshow(winName, dst);

	// 2. sobel实现(带有trackbar)
	namedWindow(winName, CV_WINDOW_AUTOSIZE);
	on_trackbar(threshold, &src);
	createTrackbar("阈值:", winName, &threshold, 256, on_trackbar, &src);

	waitKey(0);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/xfijun/article/details/51051947
今日推荐