Opencv实现边缘检测与轮廓发现及绘制轮廓方法详解
Opencv是一个开源的计算机视觉库,提供了许多图像处理和计算机视觉功能。其中边缘检测和轮廓发现是Opencv中比较常用的图像处理技术。本文将详细讲解如何使用Opencv实现边缘检测和轮廓发现,并利用这些轮廓进行图像分割、目标识别等操作。
边缘检测
边缘是图像中具有纹理、亮度、颜色、深度等特征变化的区域。在计算机视觉中,边缘检测是指通过计算图像中像素点的差异,找到图像中不同区域之间的边界。常用的边缘检测算法有Sobel算子、Laplacian算子和Canny算子。
下面是一个使用Sobel算子进行边缘检测的Python示例:
import cv2
# 读取图像
img = cv2.imread("test.jpg")
# 转为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 计算x方向和y方向的梯度
gradX = cv2.Sobel(gray, cv2.CV_32F, 1, 0)
gradY = cv2.Sobel(gray, cv2.CV_32F, 0, 1)
# 取绝对值并转换成8位图像(0~255)
gradX = cv2.convertScaleAbs(gradX)
gradY = cv2.convertScaleAbs(gradY)
# 合并梯度
grad = cv2.addWeighted(gradX, 0.5, gradY, 0.5, 0)
# 显示结果
cv2.imshow("edge", grad)
cv2.waitKey(0)
cv2.destroyAllWindows()
上述示例中,我们先读取了一张测试图像,接着将其转换为灰度图像。然后分别计算了x方向和y方向上的梯度,最后将其合并并显示出来。其中cv2.Sobel()
函数用于计算梯度值,cv2.convertScaleAbs()
函数用于将梯度值转换为8位图像。
轮廓发现及绘制
轮廓是通过连接边缘上一组连续像素点得到的连续线条。在计算机视觉中,轮廓通常被用于物体检测、目标跟踪、图像分割等领域。Opencv提供了多种轮廓发现算法,包括findContours()函数、approxPolyDP()函数、cv2.convexHull()函数等。
下面是一个使用findContours()函数和drawContours()函数进行轮廓发现和绘制的Python示例:
import cv2
# 读取图像
img = cv2.imread("test.jpg")
# 转为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 进行二值化处理
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 查找轮廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
cv2.drawContours(img, contours, -1, (0,0,255), 2)
# 显示结果
cv2.imshow("contour", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
上述示例中,我们先读取了一张测试图像,接着将其转换为灰度图像并进行二值化处理。然后使用cv2.findContours()
函数查找轮廓。最后使用cv2.drawContours()
函数将所有轮廓绘制到原图像上。其中-1
表示绘制所有轮廓,(0,0,255)
是绘制颜色,2是绘制线条宽度。
结论
本文介绍了Opencv中的边缘检测和轮廓发现两种图像处理技术,并给出了相应的Python示例。通过对这两种技术的掌握,我们可以在图像处理、目标识别、图像分割等领域有所应用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Opencv实现边缘检测与轮廓发现及绘制轮廓方法详解 - Python技术站