栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

OpenCV基础(11)基于OpenCV的边缘检测

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OpenCV基础(11)基于OpenCV的边缘检测

边缘检测是一种图像处理技术 用于识别图像中目标或区域的边界(边缘)。边缘是图像中最重要的特征之一。我们通过图像的边缘来了解图像的基本结构。因此 计算机视觉处理管道在应用中广泛地使用边缘检测。

1.如何检测边缘?

边缘的特征是像素强度的突然变化。为了检测边缘 我们需要在邻近的像素中寻找这些变化。来吧 让我们探讨一下OpenCV中可用的两种重要边缘检测算法的使用:Sobel边缘检测和Canny边缘检测。我们将讨论这些理论 并演示它们在OpenCV中的使用。

2.简单的代码示例

首先 看一看演示边缘检测的代码。我们将详细讨论每一行代码 以便您能够完全理解它。
1 Python

import cv2
# 读取原始图像
img cv2.imread( test.jpg ) 
# 显示原始图像
cv2.imshow( Original , img)
cv2.waitKey(0)
# 转换为灰度图
img_gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 模糊图像以更好地检测边缘
img_blur cv2.GaussianBlur(img_gray, (3,3), 0) 
# Sobel边缘检测
sobelx cv2.Sobel(src img_blur, ddepth cv2.CV_64F, dx 1, dy 0, ksize 5) # X轴上的Sobel边缘检测
sobely cv2.Sobel(src img_blur, ddepth cv2.CV_64F, dx 0, dy 1, ksize 5) # Y轴上的Sobel边缘检测
sobelxy cv2.Sobel(src img_blur, ddepth cv2.CV_64F, dx 1, dy 1, ksize 5) # 结合X和Y的Sobel边缘检测
# 显示Sobel边缘检测图像
cv2.imshow( Sobel X , sobelx)
cv2.waitKey(0)
cv2.imshow( Sobel Y , sobely)
cv2.waitKey(0)
cv2.imshow( Sobel X Y using Sobel() function , sobelxy)
# Canny边缘检测
edges cv2.Canny(image img_blur, threshold1 100, threshold2 200) 
# 显示Canny边缘检测图像
cv2.imshow( Canny Edge Detection , edges)
cv2.waitKey(0)

2 C

#include opencv2/opencv.hpp 
#include iostream 
// 命名空间
using namespace std;
using namespace cv;
int main()
 // 读取原始图像
 Mat img imread( test.jpg );
 // 显示原始图像
 imshow( original Image , img);
 waitKey(0);
 // 转换为灰度图
 Mat img_gray;
 cvtColor(img, img_gray, COLOR_BGR2GRAY);
 // 模糊图像以更好地检测边缘
 Mat img_blur;
 GaussianBlur(img_gray, img_blur, Size(3,3), 0);
 // Sobel边缘检测
 Mat sobelx, sobely, sobelxy;
 Sobel(img_blur, sobelx, CV_64F, 1, 0, 5);
 Sobel(img_blur, sobely, CV_64F, 0, 1, 5);
 Sobel(img_blur, sobelxy, CV_64F, 1, 1, 5);
 // 显示Sobel边缘检测图像
 imshow( Sobel X , sobelx);
 waitKey(0);
 imshow( Sobel Y , sobely);
 waitKey(0);
 imshow( Sobel XY using Sobel() function , sobelxy);
 waitKey(0);
 // Canny 边缘检测
 Mat edges;
 Canny(img_blur, edges, 100, 200, 3, false);
 // 显示Canny边缘检测图像
 imshow( Canny edge detection , edges);
 waitKey(0);
 destroyAllWindows();
 return 0;




查看Sobel图像在x方向上主要识别垂直边缘(即那些在x方向上梯度最大的)。而在y方向上则表示水平边(即在y方向上梯度最大的)。仔细看看这两张照片上老虎的条纹。注意 在Sobel图像中 条纹的垂直边缘在x方向上更加明显。对Sobel图像进行两个方向的梯度 将原始图像提取为边缘结构表示 使其结构完整性保持不变。

我们使用的下限为100 上限为200。正如你所看到的 该算法已经识别出了图像中的主要边缘 在这个过程中消除了那些对整体结构不太重要的边缘。然而 结果可以很容易地调整 所以去尝试不同的图像 改变模糊的数量 并尝试不同的阈值来获得自己的感觉。

3.Sobel边缘检测

Sobel边缘检测是应用最广泛的边缘检测算法之一。Sobel算子检测像素强度突然变化的边缘 如下图所示。

当我们画出强度函数的一阶导数时 强度的增加就更加明显了。

从上图可以看出 在梯度高于某一特定阈值的区域可以检测到边缘。此外 导数的突然变化也会显示像素强度的变化。记住这个 我们可以用3×3核来近似导数。我们使用一个核来检测X方向上像素强度的突然变化 另一个在Y方向上。

这些是用于Sobel边缘检测的核:


当这些核与原始图像进行卷积时 就得到了Sobel边缘图像.

如果我们只使用垂直核 卷积产生一个Sobel图像 边缘在x方向增强使用水平核生成一个Sobel图像 在y方向上增强边缘。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/267318.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号