网站网页设计内容,品牌高端网站建设公司,做网站大概需要多少钱,女生千万别学市场营销图像轮廓
1.获取图像轮廓
cv2.findContours() 函数是 OpenCV 库中用于检测图像中轮廓的函数。它可以检测到图像中所有连通区域的边界#xff0c;并返回这些轮廓的列表。从 OpenCV 3.4 版本开始#xff0c;这个函数的返回值和参数有所变化#xff0c;以下是详细的参数说明并返回这些轮廓的列表。从 OpenCV 3.4 版本开始这个函数的返回值和参数有所变化以下是详细的参数说明
方法
contours, hierarchy cv2.findContours( img, mode, method )
参数说明 img输入图像必须是二值图像。图像中的轮廓将基于此图像进行检测。 mode轮廓检索模式用于指定要检索哪些轮廓。可用的模式有 cv2.RETR_EXTERNAL只检索最外层的轮廓。cv2.RETR_LIST检索所有轮廓但不建立任何父子关系。cv2.RETR_CCOMP检索所有轮廓并将它们组织成两级层次结构。cv2.RETR_TREE检索所有轮廓并重建完整的层次结构。 method轮廓近似方法用于指定如何存储轮廓点。可用的方法有 cv2.CHAIN_APPROX_NONE存储所有轮廓点。cv2.CHAIN_APPROX_SIMPLE只存储轮廓的拐点这可以减少轮廓点的数量。
返回值
contours这是一个 Python 列表其中包含了检测到的轮廓。每个轮廓都是一个形状为 (n, 1, 2) 的 numpy 数组其中 n 是轮廓点的数量。hierarchy这是一个 numpy 数组包含了轮廓的层次信息。层次信息可以用来了解轮廓之间的父子关系。
2.绘制图像轮廓 在OpenCV中cv2.drawContours()函数用于在图像上绘制轮廓。这个函数非常强大因为它允许你指定轮廓的颜色、线条粗细以及其他参数。下面是这个函数的详细参数说明
方法
cv2.drawContours(img, contours, contourIdx, color, thickness, lineTypeNone, hierarchyNone)
参数说明 img目标图像即你要在其上绘制轮廓的图像。这个图像应该是一个可以修改的图像数组。 contours这是一个轮廓列表。轮廓可以是OpenCV中找到的任何轮廓通常是一个形状为(N, 1, 2)的numpy数组其中N是轮廓中的点数。 contourIdx指定要绘制的轮廓的索引。如果传递的是-1则绘制所有轮廓。 color轮廓线的颜色。这应该是一个具有三个元素的元组表示BGR颜色例如红色为(0, 0, 255)。 thickness线条的粗细。如果设置为正数则线条的粗细为指定的像素数如果设置为cv2.FILLED或-1则轮廓将被填充。 lineType可选线条的类型。默认是cv2.LINE_8表示8连通性线。其他选项包括cv2.LINE_44连通性线和cv2.LINE_AA抗锯齿线。 hierarchy可选轮廓的层次结构。这是一个与contours数组相对应的数组其中包含每个轮廓的层次信息。如果提供可以用来绘制轮廓的父子关系。
实验代码
1.获取图像
import cv2# 读取图像
phone cv2.imread(cat.png) # 读取名为cat.png的图像# 将图像转换为灰度图像
phone_gray cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY) # 将彩色图像转换为灰度图# 应用阈值操作以创建二值图像
ret, phone_binary cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY) # 使用阈值120将灰度图转换为二值图
# cv2.imshow(1,phone_binary) # 显示二值图像
2.查找轮廓
# 查找轮廓
_, contours, hierarchy cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) # 在二值图中查找轮廓
# 打印轮廓数量和层次结构信息
print(hierarchy) # 打印轮廓的层次结构信息
print(len(contours)) # 打印轮廓的数量
3.复制图像用于绘制轮廓
# 复制图像用于绘制轮廓
image_copy phone.copy()
image_copy cv2.drawContours(imageimage_copy, contourscontours, contourIdx-1, color(0, 255, 0), thickness3) # 在图像上绘制所有轮廓
# cv2.imshow(contours,image_copy) # 显示绘制了轮廓的图像
cv2.waitKey(0) # 等待按键
4.计算轮廓面积和周长
# 计算第一个和第二个轮廓的面积
area_0 cv2.contourArea(contours[0])
area_1 cv2.contourArea(contours[1])
print(area_0, area_1) # 打印面积# 计算第一个轮廓的周长
length cv2.arcLength(contours[0], closedTrue)
print(length) # 打印周长
5.查找轮廓
# 筛选面积大于10000的轮廓
a_list []
for i in range(len(contours)):if cv2.contourArea(contours[i]) 10000:a_list.append(contours[i])# 找到第七个轮廓的最小包围圆
cnt contours[6]
(x, y), r cv2.minEnclosingCircle(cnt)
phone_circle cv2.circle(phone, (int(x), int(y)), int(r), (0, 255, 0), 2) # 在图像上绘制最小包围圆
cv2.imshow(phone_circle, phone_circle) # 显示绘制了最小包围圆的图像# 找到第七个轮廓的最小包围矩形
x, y, w, h cv2.boundingRect((cnt))
phone_rectangle cv2.rectangle(phone, (x, y), (x w, y h), (0, 255, 0), 2) # 在图像上绘制最小包围矩形
cv2.imshow(phone_rectangle, phone_rectangle) # 显示绘制了最小包围矩形的图像
6.轮廓近似
# 重新查找轮廓
image, contours, hierarchy cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)# 对最后一个轮廓进行轮廓近似
epsilon 0.001 * cv2.arcLength(contours[-1], True)
approx cv2.approxPolyDP(contours[-1], epsilon, True)
phone_new phone.copy()
image_contours cv2.drawContours(phone_new, [approx], contourIdx-1, color(0, 255, 0), thickness3) # 在图像上绘制近似轮廓
cv2.imshow(image_contours, image_contours) # 显示绘制了近似轮廓的图像cv2.waitKey(0)
实验分析
通过阈值操作图像中的轮廓被清晰地分离出来这为后续的轮廓处理提供了便利。轮廓的面积和周长的计算对于理解图像中对象的大小和形状特征非常重要。最小包围圆和最小包围矩形的绘制有助于识别和定位图像中的主要对象。轮廓近似可以简化轮廓的形状减少计算复杂度同时保留轮廓的主要特征。
结论 本实验通过使用OpenCV库成功地完成了图像处理的各个步骤包括图像的读取、转换、阈值操作、轮廓查找、面积和周长计算、最小包围圆和矩形的绘制以及轮廓近似。这些技术在图像识别、对象检测和图像分析等领域有着广泛的应用。