news 2026/4/5 14:18:31

基于 OpenCV 的图像边缘检测与轮廓分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于 OpenCV 的图像边缘检测与轮廓分析

文章目录

    • 一、边缘检测方法
      • 1. Sobel算子边缘检测
      • 2. Scharr算子边缘检测
      • 3. Laplacian边缘检测
      • 4. Canny边缘检测
    • 二、图像轮廓分析
      • 1. 轮廓提取基础
      • 2. 轮廓绘制方法
      • 3. 轮廓特征计算
      • 4. 轮廓定位与排序
      • 5. 轮廓几何特征
    • 三、轮廓近似与简化

一、边缘检测方法

1. Sobel算子边缘检测

Sobel算子通过计算图像灰度函数的梯度来检测边缘,分别计算水平和垂直方向的梯度,然后合并得到完整边缘图像。

importcv2 pic=cv2.imread(r"picture_1.jpg",0)pic_x_64=cv2.Sobel(pic,cv2.CV_64F,dx=1,dy=0)pic_x_full=cv2.convertScaleAbs(pic_x_64)pic_y_64=cv2.Sobel(pic,cv2.CV_64F,dx=0,dy=1)pic_y_full=cv2.convertScaleAbs(pic_y_64)pic_xy_sobel_full=cv2.addWeighted(pic_x_full,1,pic_y_full,1,0)

参数分析:

  • cv2.CV_64F:输出图像的深度,64位浮点数类型
  • dx=1, dy=0:计算x方向(水平)梯度
  • dx=0, dy=1:计算y方向(垂直)梯度
  • cv2.convertScaleAbs():将负梯度值转换为绝对值并缩放

2. Scharr算子边缘检测

Scharr算子是Sobel算子的改进版本,对边缘的响应更敏感,能检测到更细微的边缘变化。

pic=cv2.imread(r"picture_1.jpg",cv2.IMREAD_GRAYSCALE)pic_x_64=cv2.Scharr(pic,cv2.CV_64F,dx=1,dy=0)pic_x_full=cv2.convertScaleAbs(pic_x_64)pic_y_64=cv2.Scharr(pic,cv2.CV_64F,dx=0,dy=1)pic_y_full=cv2.convertScaleAbs(pic_y_64)pic_xy_scharr_full=cv2.addWeighted(pic_x_full,1,pic_y_full,1,0)

3. Laplacian边缘检测

Laplacian算子基于二阶导数,能同时检测图像的两个方向的边缘,对噪声更敏感但能检测到更精细的边缘。

pic=cv2.imread(r"picture_1.jpg",cv2.IMREAD_GRAYSCALE)pic_lap=cv2.Laplacian(pic,cv2.CV_64F,ksize=3)pic_lap_full=cv2.convertScaleAbs(pic_lap)

参数分析:

  • ksize=3:拉普拉斯核的大小,必须为正奇数

4. Canny边缘检测

Canny边缘检测是多阶段算法,包括高斯滤波、梯度计算、非极大值抑制和双阈值检测,是效果最好的边缘检测算法之一。

pic=cv2.imread(r"picture_1.jpg",cv2.IMREAD_GRAYSCALE)pic_canny=cv2.Canny(pic,100,150)

参数分析:

  • 100:低阈值,低于此值的边缘被丢弃
  • 150:高阈值,高于此值的边缘被保留为强边缘

二、图像轮廓分析

1. 轮廓提取基础

轮廓提取需要先将图像转换为二值图像,然后使用findContours函数查找轮廓。

# 灰度图处理phone=cv2.imread(r"picture_1.jpg")phone=cv2.resize(phone,dsize=None,fx=0.4,fy=0.4)phone_gray=cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)# 阈值处理为二值图像ret,phone_binary=cv2.threshold(phone_gray,120,255,cv2.THRESH_BINARY)# 查找轮廓_,contours,hierarchy=cv2.findContours(phone_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)print(len(contours))

参数分析:

  • cv2.THRESH_BINARY:阈值化类型,大于阈值设为255,小于设为0
  • cv2.RETR_TREE:轮廓检索模式,检索所有轮廓并重建完整的层次结构
  • cv2.CHAIN_APPROX_NONE:轮廓近似方法,存储所有轮廓点

2. 轮廓绘制方法

image_copy=phone.copy()cv2.drawContours(image=image_copy,contours=contours,contourIdx=-1,color=(0,255,0),thickness=2)# 逐个绘制轮廓的替代方法foriinrange(len(contours)):image_copy=cv2.drawContours(image=image_copy,contours=contours,contourIdx=i,color=(0,255,0),thickness=3)cv2.imshow('Contours_show',image_copy)cv2.waitKey(0)

参数分析:

  • contourIdx=-1:绘制所有轮廓,指定索引则绘制单个轮廓

3. 轮廓特征计算

# 轮廓面积计算area_0=cv2.contourArea(contours[0])area_1=cv2.contourArea(contours[1])# 轮廓周长计算length=cv2.arcLength(contours[0],closed=True)# 根据面积筛选轮廓a_list=[]foriincontours:ifcv2.contourArea(i)>10000:a_list.append(i)

4. 轮廓定位与排序

# 根据面积排序获取最大轮廓sortcnt=sorted(contours,key=cv2.contourArea,reverse=True)[0]image_contours=cv2.drawContours(image_copy,[sortcnt],contourIdx=-1,color=(0,0,255),thickness=3)

5. 轮廓几何特征

cnt=contours[8]# 最小外接圆(x,y),r=cv2.minEnclosingCircle(cnt)phone_circle=cv2.circle(phone,center=(int(x),int(y)),radius=int(r),color=(0,255,0),thickness=2)# 最小外接矩形x,y,w,h=cv2.boundingRect(cnt)phone_rectangle=cv2.rectangle(phone,pt1=(x,y),pt2=(x+w,y+h),color=(0,255,0),thickness=2)

三、轮廓近似与简化

轮廓近似可以减少轮廓点的数量,同时保持轮廓的基本形状,常用于减少计算复杂度和数据存储。

phone=cv2.imread('phone.png')phone_gray=cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)ret,phone_thresh=cv2.threshold(phone_gray,120,255,cv2.THRESH_BINARY)# 兼容不同OpenCV版本的轮廓查找contours=cv2.findContours(phone_thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)[-2]# 轮廓近似epsilon=0.01*cv2.arcLength(contours[0],closed=True)approx=cv2.approxPolyDP(contours[0],epsilon,closed=True)print(contours[0].shape)# 原始轮廓点数print(approx.shape)# 近似后轮廓点数# 绘制近似轮廓phone_new=phone.copy()image_contours=cv2.drawContours(phone_new,[approx],contourIdx=-1,color=(0,255,0),thickness=3)

参数分析:

  • epsilon:近似精度参数,通常取轮廓周长的百分比
  • closed=True:指示轮廓是封闭的
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/5 7:39:19

从模型到服务:GTE中文语义相似度镜像全链路应用指南

从模型到服务:GTE中文语义相似度镜像全链路应用指南 1. 引言:语义相似度的工程落地挑战与轻量级解决方案 在当前自然语言处理(NLP)广泛应用的背景下,语义相似度计算已成为推荐系统、智能客服、文本去重、信息检索等场…

作者头像 李华
网站建设 2026/4/5 3:38:24

从零构建中文相似度系统|基于GTE大模型镜像的实践全解析

从零构建中文相似度系统|基于GTE大模型镜像的实践全解析 在自然语言处理(NLP)领域,语义相似度计算是搜索、推荐、问答和RAG系统中的核心能力。传统的关键词匹配方法已无法满足对“语义理解”的高要求。近年来,随着文本…

作者头像 李华
网站建设 2026/4/5 8:28:54

为什么Java程序员面试之前建议刷刷题?

这么说吧,你是个手艺不错的厨子,平时炒菜炖汤都没问题。但突然通知你要去参加一个“厨王争霸赛”,比赛规则是:给你半小时,现场抽一道经典菜,比如鱼香肉丝或者开水白菜,让你立刻复原出来。 你懵…

作者头像 李华
网站建设 2026/3/26 7:10:15

从单图到批量抠图全攻略|基于CV-UNet大模型镜像的实用化落地实践

从单图到批量抠图全攻略|基于CV-UNet大模型镜像的实用化落地实践 随着AI图像处理技术的发展,智能抠图已从实验室走向实际生产环境。传统抠图依赖人工绘制Trimap或复杂后期操作,效率低、成本高。而基于深度学习的自动抠图模型如CV-UNet&#…

作者头像 李华
网站建设 2026/4/5 5:19:50

AutoGLM-Phone-9B核心优势解析|附多模态模型安装与验证教程

AutoGLM-Phone-9B核心优势解析|附多模态模型安装与验证教程 1. AutoGLM-Phone-9B 核心优势深度解析 1.1 轻量化设计:90亿参数下的高效推理能力 AutoGLM-Phone-9B 是一款专为移动端和资源受限设备优化的多模态大语言模型,其最显著的技术特征…

作者头像 李华
网站建设 2026/4/4 7:35:07

无需GPU!用中文情感分析镜像实现高效正面负面判断

无需GPU!用中文情感分析镜像实现高效正面负面判断 1. 引言:为什么需要轻量级中文情感分析? 在社交媒体、电商评论、用户反馈等场景中,中文情感分析已成为企业洞察用户情绪的核心技术手段。传统方案往往依赖高性能GPU和复杂的部署…

作者头像 李华