边缘检测 sobel算子

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wodownload2/article/details/89515722

https://baike.baidu.com/item/一阶差分/3937421
https://wenku.baidu.com/view/568fb133ee06eff9aef80748.html?sxts=1556172772761
https://wenku.baidu.com/view/397f2605793e0912a21614791711cc7931b778e6.html?from=search

sobel算子
https://www.jianshu.com/p/2334bee37de5
https://blog.csdn.net/chaipp0607/article/details/72236892
https://www.ctolib.com/topics-110288.html
https://blog.csdn.net/a664607530/article/details/79317853 有参考代码
视频教程:
https://www.bilibili.com/video/av31467270/?p=18

首先端上程序代码:

// OpenCVDemo.cpp : 定义控制台应用程序的入口点。

//



#include "stdafx.h"

#include <opencv2\opencv.hpp>

using namespace cv;

bool sobelEdge(const cv::Mat image, cv::Mat &result, uchar threshold)

{

	int xxx = image.channels(); //测试读取了几个通道

	CV_Assert(image.channels() == 1);
	cv::Mat sobelx = (cv::Mat_<float>(3, 3) << 1, 0, -1, 2, 0, -2, 1, 0, -1);
	cv::Mat sobely = (cv::Mat_<float>(3, 3) << 1, 2, 1, 0, 0, 0, -1, -2, -1);
	result = cv::Mat::zeros(image.rows - 2, image.cols - 2, image.type());
	double graMag = 0;
	for (int i = 1; i < image.rows - 1; i++)
	{
		for (int j = 1; j < image.cols - 1; j++)
		{
			float edgex = 0, edgey = 0;
			for (int k = -1; k < 2; k++)
			{
				for (int p = -1; p < 2; p++)
				{
					edgex += (float)image.at<uchar>(k + i, p + j) * sobelx.at<float>(1 + k, 1 + p);
					edgey += (float)image.at<uchar>(k + i, p + j) * sobely.at<float>(1 + k, 1 + p);
				}
			}
			graMag = sqrt(pow(edgex, 2) + pow(edgey, 2));
			result.at<uchar>(i - 1, j - 1) = ((graMag > threshold) ? 255 : 0);
		}
	}
	return true;
}



int main()

{

	/*flags = -1:imread按解码得到的方式读入图像

	flags = 0:imread按单通道的方式读入图像,即灰白图像

	flags = 1:imread按三通道方式读入图像,即彩色图像*/

	cv::Mat image = cv::imread("lena.jpg",0); //以弧度图的方式读取图片
	cv::imshow("image", image);
	cv::Mat edgeMat;
	sobelEdge(image, edgeMat, 100); //阈值设置为100,大于这个值表示弧度跃变太快即为边缘。
	cv::imshow("edgeMat", edgeMat);
	cv::waitKey(0);

	return 0;

}

解释:
在这里插入图片描述

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wodownload2/article/details/89515722