基于Canny边缘检测和轮廓检测
这段代码实现了基于Canny边缘检测和轮廓检测,从图像中筛选出面积较大的矩形,并使用OpenCV和Matplotlib显示结果。主要流程如下:
步骤详解:
-
读取图像:
img = cv2.imread('U:/1.png')
使用
cv2.imread()
加载图像。 -
转换为灰度图像:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
使用
cv2.cvtColor()
将图像从BGR色彩空间转换为灰度图,以便后续处理。 -
边缘检测:
edges = cv2.Canny(gray, 50, 150)
使用
cv2.Canny()
进行Canny边缘检测,检测图像中的边缘。 -
轮廓检测:
contours, hierarchy = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
使用
cv2.findContours()
检测图像中的轮廓。参数cv2.RETR_LIST
用于提取所有轮廓,而cv2.CHAIN_APPROX_SIMPLE
用于减少轮廓的点数(仅保留直线的端点)。 -
筛选矩形:
for cnt in contours: approx = cv2.approxPolyDP(cnt, 0.01 * cv2.arcLength(cnt, True), True) if len(approx) == 4: area = cv2.contourArea(cnt) if area > min_area: cv2.drawContours(img, [approx], 0, (0, 255, 0), 3)
- 对每个轮廓进行多边形近似,使用
cv2.approxPolyDP()
方法。 - 判断是否为矩形(即有4个顶点)。
- 计算轮廓面积并筛选出面积较大的矩形(面积大于设定的
min_area
阈值)。 - 用
cv2.drawContours()
绘制矩形轮廓,使用绿色((0, 255, 0)
)并设定线宽为3。
- 对每个轮廓进行多边形近似,使用
-
显示结果:
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) fig, axes = plt.subplots(1, 2, figsize=(12, 6)) axes[0].imshow(edges, cmap='gray') axes[0].set_title("Edges Detected") axes[0].axis('off') axes[1].imshow(img_rgb) axes[1].set_title("Rectangles Detected") axes[1].axis('off') plt.show()
- 将最终结果(BGR图像)转换为RGB图像,以便正确显示。
- 使用Matplotlib创建一个1行2列的子图,左图显示边缘检测结果,右图显示带有矩形框的原始图像。
plt.show()
用于展示结果。
效果:
- 边缘检测图像:显示了图像中所有的边缘。
- 带有矩形的最终图像:显示了通过轮廓检测与面积筛选出的矩形,矩形用绿色框标注。
优化建议:
min_area
阈值:你可以根据图像内容调整min_area
的值,以过滤掉较小的噪声。- 矩形的筛选条件:除了长宽比、面积等条件,你还可以进一步结合矩形的位置、形态等特征进行更精确的筛选。
- 图像预处理:有时在边缘检测前进行图像的平滑处理(如高斯模糊)可以减少噪声,提高检测效果。
该代码适用于需要从图像中提取矩形区域的场景,特别适用于图像中具有明显边缘和几何形状的对象。