搭配:基于OpenCV的边缘检测实战

简介: 搭配:基于OpenCV的边缘检测实战

引言


计算机中的目标检测与人类识别物体的方式相似。作为人类,我们可以分辨出狗的形象,因为狗的特征是独特的。尾巴、形状、鼻子、舌头等特征综合在一起,帮助我们把狗和牛区分开来。


同样,计算机能够通过检测与估计物体的结构和性质相关的特征来识别物体。其中一个特征就是边缘。


在数学上,边是两个角或面之间的一条线。边缘检测的关键思想是像素亮度差异极大的区域表示边缘。因此,边缘检测是对图像亮度不连续性的一种度量。


Sobel边缘检测


Sobel边缘检测器也称为Sobel–Feldman运算符或Sobel过滤器,它的工作原理是通过计算图像中每个像素的图像强度梯度。


它找到了从亮到暗的最大亮度增加方向以及该方向的变化率。使用该过滤器时,可以分别在X和Y方向上或一起处理图像。

Sobel检测器使用3X3核函数,这些核函数与原始图像进行卷积,计算出导数的近似值。


为了检测图像中的水平边缘(x方向) ,我们将使用x方向内核来扫描图像,用于检测垂直边缘。


import cv2
import numpy as np
import matplotlib.pyplot as plt
# Load the image
image_original = cv2.imread('building.jpg', cv2.IMREAD_COLOR)
# Convert image to gray scale
image_gray = cv2.cvtColor(image_original, cv2.COLOR_BGR2GRAY)
# 3x3 Y-direction  kernel
sobel_y = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])
# 3 X 3 X-direction kernel
sobel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
# Filter the image using filter2D, which has inputs: (grayscale image, bit-depth, kernel)
filtered_image_y = cv2.filter2D(image_gray, -1, sobel_y)
filtered_image_x = cv2.filter2D(image_gray, -1, sobel_x)


现在,让我们绘制上面代码的输出。


(fig, (ax1, ax2, ax3)) = plt.subplots(1, 3, figsize=(25, 25))
ax1.title.set_text('Original Image')
ax1.imshow(image_original)
ax2.title.set_text('sobel_x')
ax2.imshow(filtered_image_y)
ax3.title.set_text('sobel_y filter')
ax3.imshow(filtered_image_x)
plt.show()


不需要记住所有的过滤器内核。可以直接在 OpenCV 库中使用您选择的相应过滤器。


在OpenCV中,可以像如下所示应用Sobel边缘检测。


sobel_x_filtered_image = cv2.Sobel(image_gray, cv2.CV_64F, 1, 0, ksize=3)
sobel_x_filtered_image = cv2.Sobel(image_gray, cv2.CV_64F, 0, 1, ksize=3)
sobel_y_filtered_image = cv2.convertScaleAbs(sobel_x_filtered_image)
sobel_y_filtered_image = cv2.convertScaleAbs(sobel_y_filtered_image)


Laplacian边缘检测


拉普拉斯边缘检测器比较图像的二阶导数。它测量的是一阶导数在一次通过中的变化率。拉普拉斯边缘检测使用一个核心,包含负值的交叉模式,如下所示。



拉普拉斯边缘检测器的一个缺点是对噪声敏感。也就是说,它可能最终检测噪声作为边缘。在应用拉普拉斯过滤器之前对图像进行平滑处理是一种常见的做法。


我们可以实现一个拉普拉斯边缘检测器如下:


import cv2
import numpy as np
import matplotlib.pyplot as plt
image_original = cv2.imread('building.jpg', cv2.IMREAD_COLOR)
# remove noise
image_gray = cv2.cvtColor(image_original, cv2.COLOR_BGR2GRAY)
# Reduce noise in image
img = cv2.GaussianBlur(image_gray,(3,3),0)
# Filter the image using filter2D, which has inputs: (grayscale image, bit-depth, kernel)
filtered_image = cv2.Laplacian(img, ksize=3, ddepth=cv2.CV_16S)
# converting back to uint8
filtered_image = cv2.convertScaleAbs(filtered_image)
# Plot outputs
(fig, (ax1, ax2)) = plt.subplots(1, 2, figsize=(15, 15))
ax1.title.set_text('Original Image')
ax1.imshow(image_original)
ax2.title.set_text('Laplacian Filtered Image')
ax2.imshow(filtered_image, cmap='gray')


Canny边缘检测


Canny边缘检测可以分为如下四个步骤:


· 消除噪音

· 梯度计算

· 利用非最大值抑制提取图像边缘

· 滞后阈值法


因为Canny边缘检测对噪声很敏感,所以第一步就是去噪,通过首先应用高斯滤波器对图像进行平滑处理。


Canny边缘检测的第二步是梯度计算。它通过沿着梯度方向计算图像中灰度(梯度)的变化率来实现。


我们知道图像的亮度在边缘处最高,但实际上,亮度并不是在一个像素处达到峰值; 相反,邻近的像素具有很高的亮度。在每个像素位置,canny 边缘检测比较像素,并在沿梯度方向选择3X3邻域的局部最大值。这个过程被称为非最大值抑制。


这一步结束之后,会形成一些破碎的边缘。最后一步是使用一种叫做滞后阈值的方法来修复这些断裂的边缘。


对于滞后阈值,有两个阈值: 高阈值和低阈值。


任何梯度值高于高阈值的像素自动保持为边缘。对于梯度位于高阈值和低阈值之间的像素,有两种处理方式。检查像素是否可能连接到边缘; 如果连接,则保留像素,否则丢弃。低于低阈值的像素被自动丢弃。


现在,让我们通过OpenCV实现一个Canny边缘检测。


import cv2
import numpy as np
import matplotlib.pyplot as plt
image_original = cv2.imread('building.jpg', cv2.IMREAD_COLOR)
# remove noise
image_gray = cv2.cvtColor(image_original, cv2.COLOR_BGR2GRAY)
filtered_image = cv2.Canny(image_gray, threshold1=20, threshold2=200)
# Plot outputs
(fig, (ax1, ax2)) = plt.subplots(1, 2, figsize=(15, 15))
ax1.title.set_text('Original Image')
ax1.imshow(image_original)
ax2.title.set_text('Laplacian Filtered Image')
ax2.imshow(filtered_image, cmap='gray')

相关文章
|
3月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
137 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
3月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
167 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
|
2月前
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
90 2
|
3月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
48 10
|
6月前
|
算法 计算机视觉
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
75 0
|
6月前
|
机器学习/深度学习 算法 数据库
【功能超全】基于OpenCV车牌识别停车场管理系统软件开发【含python源码+PyqtUI界面+功能详解】-车牌识别python 深度学习实战项目
【功能超全】基于OpenCV车牌识别停车场管理系统软件开发【含python源码+PyqtUI界面+功能详解】-车牌识别python 深度学习实战项目
|
6月前
|
计算机视觉 Python
实战| 手把手教你实现俯卧撑实时计数:OpenCV+MediaPipe
实战| 手把手教你实现俯卧撑实时计数:OpenCV+MediaPipe
|
6月前
|
监控 安全 计算机视觉
实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测
实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测
|
6月前
|
人工智能 算法 Ubuntu
【案例实战】 基于OpenCV实现鹿茸面积计算
有人询问如何计算鹿茸蜡皮面积占比。利用OpenCV实验大师工具软件,经过图像处理步骤(包括边缘检测、轮廓识别),成功计算出两个区域的面积,展示了一步到位的OpenCV解决方案。OEMTS软件旨在促进数字图像处理教学,助力成为合格的OpenCV开发者。详情见课程链接和OEMTS安装指南。
74 0
|
7月前
|
数据采集 数据挖掘 计算机视觉
最全OpenCV-Python实战(3)——OpenCV中绘制图形与文本,面试官必问问题及答案
最全OpenCV-Python实战(3)——OpenCV中绘制图形与文本,面试官必问问题及答案