IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> day17:图像的边缘检测 -> 正文阅读

[人工智能]day17:图像的边缘检测

需要说 的是 由于求取边缘结果可能会有负数,?不在原始图像的 8U 的数据类型内,因此滤波后的图像数据类型为 CV 1 6S

?代码:

void visionagin::Myedge(Mat& img)
{
	Mat kernelx = (Mat_<float>(1, 3) << 1, 0, -1);//x方向的边缘检测滤波器
	Mat kernely = (Mat_<float>(3, 1) << 1, 0, -1);// y 方向的边缘检测滤波器
	Mat kernelleftup=(Mat_<float>(2, 2) << 1, 0, 0, -1);//左上到右下
	Mat kernelrightup = (Mat_<float>(2, 2) << 0,-1,1,0);//右上到左下
	Mat resx, resy, reslu, resru,res;//求取边缘检测后的数据有负数,用cv_16s接收
	filter2D(img, resx, CV_16S, kernelx, Point(-1, -1));
	filter2D(img, resy, CV_16S, kernely, Point(-1, -1));
	filter2D(img, reslu, CV_16S, kernelleftup, Point(-1, -1));
	filter2D(img, resru, CV_16S, kernelrightup, Point(-1, -1));
	convertScaleAbs(resx, resx);
	convertScaleAbs(resy, resy);
	convertScaleAbs(reslu, reslu);
	convertScaleAbs(resru, resru);//将结果图像像素值绝对值化
	res = resx + resy;
	imshow("res", res);//x,y方向的边缘检测方向结果相加即为整个图像的边缘检测结果
	imshow("resx", resx);
	imshow("resy", resy);
	imshow("reslu", reslu);
	imshow("resru", resru);
}

?

?1:Sobel算子

任意-个方向的差分阶数都需要小子算子的尺寸,特殊情况是,当 ksize=1?时,任意一个方向阶数需要小于 3. 在一般情况下,当差分阶数的最大值为1时,算子尺寸选3?,当差分阶数的最大值为 2时,算子尺寸选5?,当差分阶数最大值为3,?算子尺寸选 7. 当算子尺寸 ksize=,1,程序中使用的算子尺寸不再是正方形而是 3x 1 或者 1x 3.

?

代码:

void visionagin:: SobelOperate(Mat& img)
{
	Mat resx, resy, res;
	Sobel(img, resx, CV_16S, 2, 0, 5);//x方向二阶边缘
	Sobel(img, resy, CV_16S, 0, 1, 3);//y方向一阶边缘
	convertScaleAbs(resx, resx);
	convertScaleAbs(resy, resy);
	res = resx + resy;
	imshow("res", res);
	imshow("resx", resx);
	imshow("resy", resy);
}

?

2.Scharr算子:

虽然 S obel 算子 可以有效地提取图像 边缘,但 是对图像中较弱的边缘提取效果较差.因此 为 了能够有效地提取出较弱的边缘, 要将像 素值间的 差距增大, 于是引 入 Scharr 算子. Scharr 算子
是对 Sobel 差异性的增强,因此两者在 检测图 像边缘的 原理和使 用方式上相 同. Scharr 算子的
边缘检测滤波的尺寸为3? x3,? 因此也称其 Scharr 滤波器.

?该函数的第四个、第五个参 数分别是提取x方向边缘和y方向边缘的标志,该函数要求这两个参数只能有一个参数为 1. 且不能同时为 0.否则则该函数将无法提取图像边缘,该函数默认的滤波器尺寸为 3x 3并且无法修改.

?3.生成边缘检测滤波器

Scharr ? 算子只有 种, 但是 Sobel? 算子却有不同尺寸、不同阶次,? 在实际使用过程中, 即使了解 Sobel? 算子的原理 , 推导出边缘提取需 要的滤波器也 是十分复杂而烦琐的任务。
并且,有时我们并不希望提取图像中的边缘,而是希望得到能够提取图像边缘的滤波器,通过
对滤波器的修改提升边缘检测的效果.在 Opencv? 中,提供了 ge tDe rivKern els() 函数,通过该
函数可以得到不同尺寸、不同阶次的 Sobel 算子和 Scharr? 算子的滤波器.
void visionagin:: GetkerenelOperate(Mat& img)
{
	Mat sobelx1, sobelx2, sobelx3,sobely1,sobely2,sobely3, scharrx1,scharry1;
	Mat sobel1, sobel2, sobel3, scharr1;
	//x方向一阶sobel算子
	getDerivKernels(sobelx1, sobely1, 1, 0, 3);//结果Ksize*1的矩阵
	sobelx1 = sobelx1.reshape(CV_8U, 1);
	sobel1 = sobely1 * sobelx1;//相乘的矩阵列行相等
	//x方向二阶sobel算子
	getDerivKernels(sobelx2, sobely2, 2, 0, 5);
	sobelx2 = sobelx2.reshape(CV_8U, 1);
	sobel2 = sobely2 * sobelx2;
	//y方向三阶sobel算子
	getDerivKernels(sobelx3, sobely3, 0, 3, 7);
	sobelx3 = sobely3.reshape(CV_8U, 1);
	sobel3 = sobely3 * sobelx3;
	//x方向一阶Scharr算子
	getDerivKernels(scharrx1, scharry1, 1, 0, FILTER_SCHARR);//生成Scharr算子标志,FILTER_SCHARR
	scharrx1 = scharrx1.reshape(CV_8U, 1);
	scharr1 = scharry1 * scharrx1;
	cout << sobel1 << endl;
	cout << sobel2 << endl;
	cout << sobel3 << endl;
	cout << scharr1 << endl;
}

?4.Laplacian算子

上述的边缘检测算子都具有方向, 因此需要分别求x 方向的边缘,y方 向的边 缘,将两个方向的边缘综合得到图像的整 体边缘,Laplacian算子 具有各 方向同 性的特性,能 够对任意方向的边缘进行提取,具有 无方 向性 的优点 , 使用Laplacian算子 提取边缘不需要 检测 x方向 的边缘和y方向的边缘 ,只需要一 次边缘检 测. Laplacian算子 是一种二阶 导数算子,对噪声 敏感, 因此常需要配合 高斯滤波 一 起使用。

void visionagin::LaplassianOperate(Mat& img)
{
	Mat lapsres, lapsres2;
	Laplacian(img, lapsres, CV_16S, 1);
	convertScaleAbs(lapsres, lapsres);//绝对值化
	imshow("未去除噪声", lapsres);//未进行高斯滤波进行的laps边缘检测

	GaussianBlur(img, img, Size(3, 3), 1);//先进行高斯滤波
	Laplacian(img, lapsres2, CV_16S, 3);
	convertScaleAbs(lapsres2, lapsres2);
	imshow("去除噪声后", lapsres2);
}

结果:

?

?5.Canny算法

?

void visionagin:: Mycanny(Mat& img)
{
	Mat res1, res2, res3, res4;
	Canny(img, res1, 20, 40);
	imshow("res1低阈值", res1);//低阈值

	Canny(img, res2, 100, 200);
	imshow("res2高阈值", res2);//高阈值

	GaussianBlur(img, img, Size(3, 3), 5);
	Canny(img, res3, 20, 40);//进行了高斯滤波
	imshow("res3低阈值", res3);

	Canny(img, res4, 100, 200);
	imshow("res4高阈值", res4);
}

结果:分别为未进行高斯滤波,Canny低阈值,高阈值图像,以及进行高斯滤波Canny低阈值,高阈值图像

?未进行高斯滤波以及进行了高斯滤波:

结果表明高斯模糊在边缘纹理较多的区域能减少边缘检测的结果 但是对纹理较少 的区域影响较小.
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:31:30  更:2021-10-11 17:33:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 10:41:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码