;(老师能看备注,学生看不到,便于老师上课讲解);下面为备注功能具体操作演示视频;;;;项目目标;图像的轮廓特征是图像中非常重要的一种特征。在实际应用中,经常利用轮廓的大小、形状、位置和方向等特征来进行图像的识别和分类。了解到这一点,小旌打算根据图像轮廓形状的不同,对图像中的交通标志进行识别和分类。
小旌发现,交通标志的形状有一定的规律,如限速标志的形状为圆形,警示标志的形状为三角形,指示标志的形状为矩形。他打算首先对交通标志图像进行预处理,包括色彩空间的转换和高斯滤波,然后对预处理后的图像进行Canny边缘检测和图像轮廓查找与绘制,并根据轮廓查找的结果,对每个轮廓进行形状识别,以实现交通标志的分类。;项目准备;01;边缘检测;边缘检测1.图像梯度;;;;【例5-1】编写程序,对图像“sobel.png”(见本书配套素材“例题图像/sobel.png”)使用Sobel算子分别在x轴和y轴两个方向进行边缘检测,并显示原图像和边缘检测后的图像。;【运行结果】程序运行结果如下图所示。
;;【例?5-2】编写程序,对图像“animal.png”(见本书配套素材“例题图像/animal.png”)分别使用Sobel算子和Scharr算子进行边缘检测,并显示原图像和边缘检测后的图像。;【运行结果】程序运行结果如下图所示。Scharr算子检测出的边缘细节更多。
;;【例?5-3】编写程序,对图像“blossom.png”(见本书配套素材“例题图像/blossom.png”)使用Laplacian算子进行边缘检测,并显示原图像和边缘检测后的图像。;【运行结果】程序运行结果如下图所示。
;边缘检测图像梯度3.使用Laplacian算子进行边缘检测;边缘检测Canny边缘检测;边缘检测图像梯度3.使用Laplacian算子进行边缘检测;;【例?5-4】编写程序,对图像“blossom.png”(见本书配套素材“例题图像/blossom.png”)进行Canny边缘检测,并显示原图像和边缘检测后的图像。;【运行结果】程序运行结果如下图所示。从结果中可以看出,阈值越小,检测出的边缘信息越多;阈值越大,检测出的边缘信息越少。当阈值很高时,只能检测出一些较明显的边缘。;;02;;;图像轮廓轮廓的查找与绘制1.查找轮廓;;【例5-5】编写程序,使用OpenCV对图像“sobel.png”(见本书配套素材“例题图像/sobel.png”)进行轮廓的查找与绘制,并显示原图像和绘制轮廓后的图像。;【运行结果】程序运行结果如下图所示。
;;;【例5-6】编写程序,使用OpenCV对图像“sobel.png”(见本书配套素材“例题图像/sobel.png”)进行轮廓的查找,并计算和显示轮廓的周长和面积。;【运行结果】程序运行结果如下图所示。
;;;【例5-7】编写程序,使用OpenCV对图像“shape.png”(见本书配套素材“例题图像/shape.png”)进行轮廓的查找,分别为轮廓绘制矩形包围框和最小外接圆,并显示原图像、绘制矩形包围框后的图像和绘制最小外接圆后的图像。;【参考代码】
x,y,w,h=cv2.boundingRect(contours[0]) #计算轮廓的矩形包围框
cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),3) #绘制矩形框
cv2.imshow(BoundingRect,image) #显示绘制矩形包围框后的图像
#计算轮廓的最小外接圆
(x,y),radius=cv2.minEnclosingCircle(contours[0])
center=(int(x),int(y))
radius=int(radius)
cv2.circle(image1,center,radius,(0,0,255),3) #绘制最小外接圆
cv2.imshow(MinEnclosingCircle,image1)#显示绘制最小外接圆后的图像
cv2.waitKey() #窗口等待,按任意键继续
cv2.destroyAllWindows() #释放所有窗口;【运行结果】程序运行结果如下图所示。
;;【例5-8】编写程序,使用OpenCV对图像“shape.png”(见本书配套素材“例题图像/shape.png”)进行轮廓的查找,分别为轮廓绘制逼近精度为“0.01×轮廓周长”和“0.05×轮廓周长”的近似多边形,并显示原图像、绘制近似多边形后的图像。;【参考代码】
#获取图像轮廓的近似