利用OpenCV提取图像边缘轮廓


在这里插入图片描述

导入库与图像

import cv2
img = cv2.imread('路径')

1.降低图像复杂度

转灰度图像
gray_img = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

2.去噪

高斯模糊
gauss_img = cv2.GaussianBlur(gray_img,(3,3),0)

//( ,)为高斯核大小ksize,只能为正奇数,宽度和高度越大越模糊
中值滤波
median_img= cv2.medianBlur(gauss_img,3)

//3:ksize为内核大小,越大滤波效果越强,去噪更明显

3.二值化

固定阈值处理

适用于光照均匀的图像,处理速度快,适合简单的二值化任务

_, binary_image = cv2.threshold(median_img,127,255,cv2.THRESH_BINARY)

//-,表示忽略第一个返回值,只返回第二个,这里第一个为阈值大小,第二个为二值化后的图像
//127为阈值,灰度值低于127的像素将变为0(黑色),高于或等于127的像素变为255(白色)
//255为最大值,超过阈值将被赋予此值
自适应阈值处理

适用于光照不均匀、存在阴影或渐变光照的图像,可以更好地处理复杂的场景

thresholded = cv2.adaptiveThreshold(median_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 11, 2)

//255:二值化结果中超过阈值的像素将设置为255
//cv2.ADAPTIVE_THRESH_GAUSSIAN_C:使用高斯加权平均值计算局部阈值
每个像素的阈值是根据其邻域内像素的高斯加权平均值计算的,能够更好地处理有渐变光照的图像
//cv2.THRESH_BINARY阈值类型,这里使用二值
//11:block_size,必须是奇数,表示11x11的邻域用于计算每个像素的局部阈值
//2:该值会从计算出的平均值或加权平均值中减去,用于微调阈值

4.检测图像边缘和轮廓

Canny边缘检测
cv2.Canny(image,30,150)

//30为低阈值,150为高阈值,函数通过检测图像中的梯度强度,来识别边缘,低阈值和高阈值用来控制边缘的检测强度,边缘的像素值在这两个阈值之间时,只有当这些像素是从低到高阈值边缘的连接时,才被认为是边缘
寻找边缘
contours,_ = cv2.findContours(image.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

//cv2.RETR_EXTERNAL: 一种轮廓检索模式,只检索最外层的轮廓
//cv2.CHAIN_APPROX_SIMPLE: 轮廓近似方法,它只保存轮廓的拐点信息,减少内存占用
//该函数检测图像中的轮廓,返回一个列表,其中每个元素都是图像中一个轮廓的点集

5.绘制轮廓

cv2.drawContours(solved_img,contours,-1,(0,255,0),3)

//contours轮廓列表,从findContours函数获取
//-1:指示绘制所有轮廓,如果只想绘制某个特定轮廓,可以指定其索引
//(0,255,0):颜色
//3:轮廓线条宽度
cv2.imshow('edges',edges)
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值