利用OpenCV提取图像边缘轮廓

导入库与图像
1 2
| import cv2 img = cv2.imread('路径')
|
1.降低图像复杂度
转灰度图像
1
| gray_img = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
|
2.去噪
高斯模糊
1 2 3
| gauss_img = cv2.GaussianBlur(gray_img,(3,3),0)
//( ,)为高斯核大小ksize,只能为正奇数,宽度和高度越大越模糊
|
中值滤波
1 2 3
| median_img= cv2.medianBlur(gauss_img,3)
//3:ksize为内核大小,越大滤波效果越强,去噪更明显
|
3.二值化
固定阈值处理
适用于光照均匀的图像,处理速度快,适合简单的二值化任务
1 2 3 4 5
| _, binary_image = cv2.threshold(median_img,127,255,cv2.THRESH_BINARY)
//-,表示忽略第一个返回值,只返回第二个,这里第一个为阈值大小,第二个为二值化后的图像 //127为阈值,灰度值低于127的像素将变为0(黑色),高于或等于127的像素变为255(白色) //255为最大值,超过阈值将被赋予此值
|
自适应阈值处理
适用于光照不均匀、存在阴影或渐变光照的图像,可以更好地处理复杂的场景
1 2 3 4 5 6 7 8
| 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边缘检测
1 2 3
| cv2.Canny(image,30,150)
//30为低阈值,150为高阈值,函数通过检测图像中的梯度强度,来识别边缘,低阈值和高阈值用来控制边缘的检测强度,边缘的像素值在这两个阈值之间时,只有当这些像素是从低到高阈值边缘的连接时,才被认为是边缘
|
寻找边缘
1 2 3 4 5
| contours,_ = cv2.findContours(image.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
//cv2.RETR_EXTERNAL: 一种轮廓检索模式,只检索最外层的轮廓 //cv2.CHAIN_APPROX_SIMPLE: 轮廓近似方法,它只保存轮廓的拐点信息,减少内存占用 //该函数检测图像中的轮廓,返回一个列表,其中每个元素都是图像中一个轮廓的点集
|
5.绘制轮廓
1 2 3 4 5 6
| cv2.drawContours(solved_img,contours,-1,(0,255,0),3)
//contours轮廓列表,从findContours函数获取 //-1:指示绘制所有轮廓,如果只想绘制某个特定轮廓,可以指定其索引 //(0,255,0):颜色 //3:轮廓线条宽度
|
1
| cv2.imshow('edges',edges)
|