边缘检测 sobel算子
程序员文章站
2024-01-28 09:01:04
...
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;
}
解释:
运行结果:
上一篇: 2014最新移动刷7钻q钻代码大全
下一篇: Vue背景图片打包上线后出错问题解决