边缘检测实战

《边缘检测实战:一步一步教你搞定》

嗨,小伙伴们!之前咱们了解了边缘检测的概念和一些常见的方法,今天咱们就来看看到底如何在实践中进行边缘检测。这就像是把理论知识转化成实际的魔法技能,让我们能够在图像的世界里准确地找出那些隐藏的边缘。

一、准备工作

在进行边缘检测之前,我们需要先准备好图像数据。如果你已经有了一张图像,那可以直接用;如果没有,可以从网上下载一张合适的图像,或者用Python的图像处理库(如Pillow或者OpenCV)来创建一张简单的图像。

这里我们以Python中的OpenCV库为例,假设我们已经安装好了OpenCV(如果还没安装,可以参考之前关于OpenCV安装的内容哦)。

二、使用Sobel算子进行边缘检测

(一)导入相关库

首先,我们要导入OpenCV库(cv2)和用于显示图像的Matplotlib库(matplotlib.pyplot,通常简写成plt)。

复制代码
import cv2
import matplotlib.pyplot as plt

(二)读取图像

cv2.imread()函数读取图像文件。这里假设我们有一张名为test.jpg的图像在当前工作目录下。

复制代码
img = cv2.imread('test.jpg')

(三)将图像转换为灰度图

因为Sobel算子是在灰度图像上进行操作的,所以我们需要先把彩色图像转换为灰度图。这可以用cv2.cvtColor()函数来实现。

复制代码
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

(四)应用Sobel算子

OpenCV提供了cv2.Sobel()函数来应用Sobel算子。我们需要分别计算水平和垂直方向的边缘,然后再合并结果。

复制代码
# 计算水平方向的边缘
sobel_x = cv2.Sobel(gray_img, cv2.CV_64F, 1, 0, ksize = 3)
# 计算垂直方向的边缘
sobel_y = cv2.Sobel(gray_img, cv2.CV_64F, 0, 1, ksize = 3)

# 合并水平和垂直方向的边缘
sobel = cv2.magnitude(sobel_x, sobel_y)

这里cv2.CV_64F是数据类型,表示计算结果以64位浮点数的形式存储;1, 00, 1分别是Sobel算子在水平和垂直方向上的系数;ksize = 3表示使用的卷积核大小为3×3。

(五)将结果转换为可显示的图像格式并显示

由于计算得到的边缘强度可能是浮点数,我们需要将其转换为合适的整数范围以便显示。通常可以将结果归一化到0 - 255之间,然后用cv2.convertScaleAbs()函数进行转换。

复制代码
sobel = cv2.convertScaleAbs(sobel)

# 显示原始图像和边缘检测后的图像
plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original Image')
plt.subplot(122), plt.imshow(sobel, cmap = 'gray'), plt.title('Sobel Edge Detection')
plt.show()

三、使用Canny边缘检测

(一)同样先导入库和读取图像并转换为灰度图

这部分和Sobel算子的操作一样。

复制代码
import cv2
import matplotlib.pyplot as plt

img = cv2.imread('test.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

(二)应用Canny边缘检测

cv2.Canny()函数来进行Canny边缘检测。这个函数需要传入图像以及两个阈值(低阈值和高阈值)。

复制代码
edges = cv2.Canny(gray_img, 100, 200)

这里的100是低阈值,200是高阈值。你可以根据图像的具体情况调整这两个值,以得到更好的边缘检测效果。

(三)显示结果

同样用Matplotlib来显示原始图像和边缘检测后的图像。

复制代码
plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original Image')
plt.subplot(122), plt.imshow(edges, cmap = 'gray'), plt.title('Canny Edge Detection')
plt.show()

四、使用Laplacian算子进行边缘检测

(一)导入库、读取图像并转换为灰度图

还是老样子,先做好准备工作。

复制代码
import cv2
import matplotlib.pyplot as plt

img = cv2.imread('test.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

(二)应用Laplacian算子

OpenCV中的cv2.Laplacian()函数可以用来应用Laplacian算子进行边缘检测。

复制代码
laplacian = cv2.Laplacian(gray_img, cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)

(三)显示结果

最后用Matplotlib显示结果。

复制代码
plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original Image')
plt.subplot(122), plt.imshow(laplacian, cmap = 'gray'), plt.title('Laplacian Edge Detection')
plt.show()

五、比较不同边缘检测方法的结果

当我们使用不同的边缘检测方法对同一张图像进行处理后,可以比较它们的结果。你会发现,Sobel算子检测到的边缘相对较粗,Canny边缘检测的边缘比较细且定位更准确,而Laplacian算子对噪声比较敏感,可能会产生一些双边缘的情况。

六、总结

好啦,小伙伴们,上面这些就是使用不同方法进行边缘检测的具体步骤啦。从准备图像数据,到分别应用Sobel算子、Canny边缘检测和Laplacian算子,再到显示和比较结果,这一套流程下来,你就能在实践中掌握边缘检测的技巧了

在实际应用中,你可以根据具体的需求和图像的特点来选择合适的边缘检测方法。比如,如果图像噪声较多,可能Canny边缘检测会是更好的选择;如果想要快速得到一个大致的边缘结果,Sobel算子可能就足够了。

朋友们,你们有没有试过用不同的边缘检测方法处理自己感兴趣的图像呢?有没有发现一些有趣的结果呢?欢迎在评论区留言讨论哦。

相关推荐
九亿AI算法优化工作室&7 分钟前
SA模拟退火算法优化高斯回归回归预测matlab代码
人工智能·python·算法·随机森林·matlab·数据挖掘·模拟退火算法
Blossom.11812 分钟前
基于Python的机器学习入门指南
开发语言·人工智能·经验分享·python·其他·机器学习·个人开发
郝YH是人间理想1 小时前
Python面向对象
开发语言·python·面向对象
藍海琴泉1 小时前
蓝桥杯算法精讲:二分查找实战与变种解析
python·算法
mqwguardain6 小时前
python常见反爬思路详解
开发语言·python
_庄@雅@丽6 小时前
(UI自动化测试web端)第二篇:元素定位的方法_xpath扩展(工作当中用的比较多)
python·ui自动化元素定位·xpath元素定位
测试笔记(自看)7 小时前
Python+Requests+Pytest+YAML+Allure接口自动化框架
python·自动化·pytest·allure
越甲八千7 小时前
python 中match...case 和 C switch case区别
c语言·python·xcode
只对py感兴趣的小蒟蒻8 小时前
L2-052 吉利矩阵
python