Python+OpenCV图像处理(六)——边缘检测

本文主要介绍了边缘检测在计算机视觉中的重要性,详细讲解了Sobel算子和Canny边缘检测算法的原理及OpenCV的实现。通过高斯滤波、计算梯度、非极大值抑制和双阈值检测等步骤,阐述了Canny算法的完整流程。
摘要由CSDN通过智能技术生成

系列文章
Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法
Python+OpenCV图像处理(二)——几何变换
Python+OpenCV图像处理(三)——彩色空间互换
Python+OpenCV图像处理(四)——图像滤波
Python+OpenCV图像处理(五)——图像阈值和二值化
Python+OpenCV图像处理(六)——边缘检测


六、边缘检测

6.1 边缘检测简介

边缘是指图像中图像像素值变化明显的位置。这些变化明显的位置常常是图像中需要关注的位置,对这些关键位置的检测,就叫做边缘检测。

一般情况下,我们为了检测这种不连续性,可以使用导数来完成。如下图所示:

由于在计算导数的时候,噪点很容易会被误检测作边缘,所以在进行边缘检测的时候,应先进行图像的滤波操作。

6.2 边缘检测算子

通常边缘检测的算子分为一阶算子和二阶算子,它们分别有以下几种代表:

  • 一阶算子 —— Sobel算子,Roberts Cross算子,Prewitt算子, Kirsch算子,罗盘算子
  • 二阶算子 —— Canny算子,Marr-Hildreth,在梯度方向的二阶导数过零点,Laplacian算子
6.2.1 Sobel算子

Sobel算子属于一阶算子,我们可以使用 3 × 3 3 \times 3 3×3 的卷积核来进行图像求导:

G y ′ = [ + 1 + 2 + 1 0 0 0 − 1 − 2 − 1 ] ∗ I 和 G x ′ = [ + 1 0 − 1 + 2 0 − 2 + 1 0 − 1 ] ∗ I {\displaystyle \mathbf {G}'_{y}={ \begin{bmatrix}+1&+2&+1\\0&0&0\\-1&-2&-1\end{bmatrix}}*\mathbf {I} \quad { {和}}\quad \mathbf{G}'_{x}={\begin{bmatrix}+1&0&-1\\+2&0&-2\\+1&0&-1\end{bmatrix}}*\mathbf {I} } Gy=+101+202+101IGx=+1+2+1000121I

其中 I \mathbf {I} I表示原图片, G x ′ \mathbf {G}'_{x} Gx G y ′ \mathbf {G}'_{y} Gy分别表示沿图片水平和竖直方向上的变化, ∗ * 表示卷积操作

下面以Sobel算子为例讲述如何计算梯度

x和y方向的Sobel算子分别为:

G x = [ − 1 0 + 1 − 2 0 + 2 − 1 0 + 1 ] 和 G y = [ + 1 + 2 + 1 0 0 0 − 1 − 2 − 1 ] {\displaystyle \mathbf {G}_{x}={ \begin{bmatrix}-1&0&+1\\-2&0&+2\\-1&0&+1\end{bmatrix}} \quad { {和}}\quad \mathbf{G}_{y}={\begin{bmatrix}+1&+2&+1\\0&0&0\\-1&-2&-1\end{bmatrix}}} Gx=121

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PythonOpenCV中实现直线检测,可以使用Hough变换来检测直线。Hough变换是一种常用的图像处理方法,可用于检测直线、圆等几何形状。 以下是一个简单的示例代码,使用Hough变换来检测直线并计算交点: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread('test.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 边缘检测 edges = cv2.Canny(gray, 50, 150, apertureSize=3) # Hough变换检测直线 lines = cv2.HoughLines(edges, 1, np.pi/180, 200) # 计算交点 points = [] for i in range(len(lines)): for j in range(i+1, len(lines)): rho1, theta1 = lines[i][0] rho2, theta2 = lines[j][0] if abs(theta1 - theta2) < np.pi/4: continue a = np.array([[np.cos(theta1), np.sin(theta1)], [np.cos(theta2), np.sin(theta2)]]) b = np.array([rho1, rho2]) x0, y0 = np.linalg.solve(a, b) points.append((int(x0), int(y0))) # 绘制直线和交点 for line in lines: rho, theta = line[0] a = np.cos(theta) b = np.sin(theta) x0 = a*rho y0 = b*rho x1 = int(x0 + 1000*(-b)) y1 = int(y0 + 1000*(a)) x2 = int(x0 - 1000*(-b)) y2 = int(y0 - 1000*(a)) cv2.line(img, (x1,y1), (x2,y2), (0,0,255), 2) for point in points: cv2.circle(img, point, 5, (0,255,0), -1) # 显示图像 cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在代码中,首先读取图像并进行灰度转换和边缘检测。然后使用Hough变换检测直线,并计算交点。最后绘制直线和交点,并显示图像。 需要注意的是,在计算交点时,需要将两条直线的极坐标表示转换为直角坐标表示,并使用线性方程组求解。 希望这个例子能够帮助到你实现直线检测并计算交点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值