赞
踩
在图像处理领域中,轮廓检测是一项重要的任务,用于寻找并标定图像中的物体边缘。本文将介绍如何使用OpenCV库进行图像轮廓检测,并展示一个简单的示例代码。代码中的注释将详细解释每一步的操作。
图像轮廓检测是图像处理中的一项关键技术,可用于检测物体的形状、边界等信息。在本文中,我们将演示如何使用OpenCV进行图像轮廓检测,并通过示例代码展示这一过程。
以下是一个使用OpenCV的示例代码,演示了图像轮廓检测的过程:
import cv2 import numpy as np # 读取图像 src_img = cv2.imread("demo.png") # 例如简单的5个英文验证码图片 # 将图像转换为灰度 img = cv2.cvtColor(src_img, cv2.COLOR_BGR2GRAY) # 阈值化处理,生成二值图像 thresh, img = cv2.threshold(img, 190, 255, cv2.THRESH_BINARY) # 白底黑字 print("阈值1:", thresh) thresh, img = cv2.threshold(img, 190, 255, cv2.THRESH_BINARY_INV) # 黑底白字 print("阈值2:", thresh) thresh, img = cv2.threshold(img, 1, 255, cv2.THRESH_OTSU) # 自动寻找阈值 print("自动阈值:", thresh) # 膨胀操作,填充小的空洞(去掉周围的点点) kernel = np.ones([5, 5]) img = cv2.dilate(img, kernel) # 腐蚀操作,消除噪声(把有用的英文扩大) kernel = np.ones([7, 7]) img = cv2.erode(img, kernel) # 寻找图像轮廓 contours, _ = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 计算轮廓面积 areas = [] for c in contours: area = cv2.contourArea(c) areas.append(area) areas = np.array(areas) print("轮廓面积:", areas) # 获取面积最大的5个轮廓 index = np.argsort(areas)[-6:-1] # 不是[-5:],因为最大的面积是边框 print("前5个轮廓的索引:", index) # 提取前5个轮廓 top5_contours = [] for i in range(5): top5_contours.append(contours[index[i]]) # 在原图上绘制矩形框 for c in top5_contours: # 获取矩形框坐标 x, y, w, h = cv2.boundingRect(c) # 绘制矩形框 cv2.rectangle(src_img, [x, y, x + w, y + h], [0, 0, 255], 2) # 显示结果图像 cv2.imshow("demo", src_img) cv2.waitKey(0)
首先,读取图像并将其转换为灰度图像。接着,通过阈值化处理得到二值图像,其中包括白底黑字和黑底白字两种处理方式。
通过膨胀(dilate)和腐蚀(erode)操作,对图像进行形态学处理,以填充小的空洞并消除噪声。
使用OpenCV的findContours
函数寻找图像中的轮廓,并计算每个轮廓的面积。
通过面积排序,提取前5个面积最大的轮廓。
在原图上绘制包围每个轮廓的矩形框,以突显检测到的物体。
通过上述代码示例,我们演示了如何使用OpenCV进行图像轮廓检测,并通过一系列预处理操作找到并突显图像中的主要物体。轮廓检测在计算机视觉和图像处理中有着广泛的应用,可用于目标检测、图像分割等任务。详细的注释帮助理解代码的每一步操作,为初学者提供了一个学习的起点。
代码参考源自:Shady的混乱空间
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。