![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ea469f3a4ae540f18152ed2a4c8718a6.jpeg#pic_center)
导入库与图像
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)