计算机视觉的重点是从计算机中的视频和图像中提取有意义的信息。在本文中,我们将从初学者开始探索一个使用 OpenCV 的出色计算机视觉项目。其标题是“使用计算机视觉进行边缘和轮廓检测”。对于此项目,你还将看到描述、源代码和图像分类。
边缘检测
边缘检测是一种用于定位图像中对象边界的图像处理技术。最流行和广泛使用的算法之一是 Canny 边缘检测器。Canny 边缘检测器是一种立足点检测算子,它使用多阶段算法来检测图像中的各种边缘。
- 在 Sobel 滤波器的帮助下,找出边缘的强度和方向。
- 通过应用非极大值抑制来隔离更强的边缘并将它们细化为一条像素宽的线。
pip3 install opencv-python matplotlib numpy
import cv2
import numpy as np
import matplotlib.pyplot as plt
# read the image
image = cv2.imread('little_flower.jpg')
首先,我们必须将图像转换为灰度,然后,我们可以继续将图像绕过 Canny 边缘检测器。# convert it to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# show the grayscale image
plt.imshow(gray, cmap='gray')
plt.show()
在 Canny 算法的帮助下,我们必须标记作为输入的图像中的边缘。输入图像首先传递给 cv2.Canny() 函数,然后用于边缘检测。# perform the canny edge detector to detect image edges
edges = cv2.Canny(gray, threshold1=30, threshold2=100)阈值 1 和阈值 2 之间的最小值用于边缘链接。最重要的值用于寻找强边缘的初始段。有趣的是,尝试微调边缘值,看看你是否会让它变得更好。
import NumPy as np
import cv2
cap = cv2.VideoCapture(0)
while True:
_, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 30, 100)
cv2.imshow('edges', edges)
cv2.imshow('gray', gray)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
检测边缘的最终目的是捕捉重要事件并在行星属性内执行所需的更改。它是图像处理、图像模式识别和计算机视觉技术的基本步骤之一。
轮廓检测
一个轮廓可以描述为一条曲线,将所有具有相同颜色或强度的连续点组合在一起。基本上,它们显示图片中包含的对象的形状。轮廓检测可能是一种用于形状分析和对象检测和识别的有用技术。轮廓检测并不是图像分割的唯一算法,还有很多其他算法,例如目前最先进的语义分割、霍夫变换和 K-Means 分割。为了获得更好的准确性,我们将遵循以下整个流程来成功检测图像中的轮廓:
- 输入图像的标准化是它应该始终是二进制形式。这就是为什么我们需要将其转换为二进制格式。
- 用于查找轮廓的 OpenCV 函数是 findContours()。
pip3 install matplotlib opencv-python
import cv2
import matplotlib.pyplot as plt
# read the image
image = cv2.imread('thumbs_up_down.jpg')
# convert to RGB
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
正如本教程前面提到的,我们要创建一个二值图像,这表明图像的每个像素要么是黑色的,要么是白色的。你可以将其进行比较,就像查找轮廓与检测黑板上的白色物体更相似。我们要找的物体是白色的,所以黑板需要是纯黑色的。# create a binary thresholded image
_, binary = cv2.threshold(gray, 225, 255, cv2.THRESH_BINARY_INV)
# show it
plt.imshow(binary, cmap='gray')
plt.show()通过禁用像素(即将其设置为0)和启用像素(即将其设置为225),创建二进制图像。以下是输出图像:现在,对于 OpenCV 来说,这通常很容易检测轮廓:
# find the contours from the thresholded image
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# draw all contours
image = cv2.drawContours(image, contours, -1, (0, 255, 0), 2)
上述代码很容易找到二值图像中的轮廓,最后借助粗绿线将它们输出到图像中,让我们展示一下:# show the image with the drawn contours
plt.imshow(image)
plt.show()为了在不同的世界图像上获得良好的结果,你需要调整阈值或执行边缘检测。例如,对于煎饼图像,我将边缘减少到 127,结果如下:
轮廓检测和边缘检测的区别
轮廓检测的目标是确定闭合物体的形状,特别是因为对于具有相同颜色强度的连续点,寻找轮廓的方法是确定的,而边缘检测是通过检测颜色强度内的变化来进行的。对整个图像进行边缘检测,而仅对图像内的对象进行轮廓检测。
结论
这个项目是初学者级别的,面向数据科学爱好者。本文旨在让你熟悉最简单的计算机视觉项目,以增强你在计算机视觉方面的知识。