Python OpenCV 形态学处理(腐蚀、膨胀、开闭运算)详解与实战

发布时间:2026/7/12 18:25:27

Python OpenCV 形态学处理(腐蚀、膨胀、开闭运算)详解与实战 在机器视觉、图像检测以及工业自动化项目中形态学处理Morphological Operations是最常见的图像预处理方法之一。它主要用于去除噪声、填充空洞、连接目标、分离粘连物体等通常应用在阈值分割之后。本文将介绍 OpenCV 中常见的形态学处理方法并给出完整的 Python 代码示例。一、什么是形态学处理形态学处理主要针对二值图像进行操作也可以应用于灰度图像。它通过一个称为**结构元素Kernel**的小矩阵对图像中的目标进行局部扫描从而改变目标的形状。例如原始二值图0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0经过不同形态学操作后可以实现去除小噪点填补孔洞放大目标缩小目标分离粘连区域因此在工业视觉中形态学处理几乎是所有图像预处理流程中不可缺少的一步。二、结构元素KernelOpenCV 使用一个矩阵作为结构元素。最常见的是importcv2importnumpyasnp kernelnp.ones((3,3),np.uint8)也可以使用 OpenCV 创建不同形状kernelcv2.getStructuringElement(cv2.MORPH_RECT,(5,5))支持三种形状cv2.MORPH_RECT# 矩形cv2.MORPH_ELLIPSE# 椭圆cv2.MORPH_CROSS# 十字例如矩形 Kernel1 1 1 1 1 1 1 1 1十字 Kernel0 1 0 1 1 1 0 1 0三、腐蚀Erosion腐蚀会缩小白色目标。作用去除小噪点消除毛刺分离轻微粘连目标函数dstcv2.erode(src,kernel,iterations1)参数说明参数说明src输入图像kernel结构元素iterations腐蚀次数示例importcv2importnumpyasnp imgcv2.imread(binary.png,0)kernelnp.ones((3,3),np.uint8)erodecv2.erode(img,kernel)cv2.imshow(Original,img)cv2.imshow(Erode,erode)cv2.waitKey(0)cv2.destroyAllWindows()效果███████ ███████ ↓ █████ █████白色区域变小。四、膨胀Dilation膨胀与腐蚀相反。它会扩大白色目标。函数dstcv2.dilate(src,kernel)作用补全断裂目标扩大目标区域填补小孔示例dilatecv2.dilate(img,kernel)cv2.imshow(Dilation,dilate)效果█████ ↓ ███████目标变粗。五、开运算Opening开运算先腐蚀再膨胀函数openingcv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)作用去除孤立噪点保留主体形状工业检测中使用非常广泛示例openingcv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)cv2.imshow(Opening,opening)效果● ● ● █████ ↓ █████小白点被去除。六、闭运算Closing闭运算先膨胀再腐蚀函数closingcv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)作用填补小黑洞连接断裂区域修补轮廓示例closingcv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)cv2.imshow(Closing,closing)效果████ ████ ↓ █████████中间的小缝隙被填补。七、形态学梯度Morphological Gradient梯度膨胀 − 腐蚀函数gradientcv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)效果只保留目标边缘。示例gradientcv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)cv2.imshow(Gradient,gradient)工业中常用于边缘提取外轮廓定位缺陷检测八、顶帽Top Hat顶帽原图 − 开运算函数tophatcv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)作用提取比周围更亮的小目标。例如字符小亮点划痕九、黑帽Black Hat黑帽闭运算 − 原图函数blackhatcv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)作用提取比背景更暗的区域。例如黑色字符裂纹凹坑十、工业视觉中的典型流程在实际项目中形态学处理通常不会单独使用而是与阈值分割、轮廓检测等算法组合。例如标签检测流程读取图像 ↓ 灰度化 ↓ 阈值分割 ↓ 开运算去噪 ↓ 闭运算填孔 ↓ 轮廓检测 ↓ 面积过滤 ↓ 最小外接矩形 ↓ 目标定位这也是工业视觉中最经典、最稳定的一套处理流程。十一、完整实战示例下面给出一个完整的示例实现从读取图像到形态学处理再到轮廓检测。importcv2importnumpyasnpdefprocess_image(image_path):imgcv2.imread(image_path)ifimgisNone:print(读取图片失败)returngraycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 阈值分割maskcv2.inRange(gray,120,255)kernelnp.ones((5,5),np.uint8)# 开运算去噪maskcv2.morphologyEx(mask,cv2.MORPH_OPEN,kernel)# 闭运算填孔maskcv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernel)contours,_cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)resultimg.copy()forcntincontours:areacv2.contourArea(cnt)ifarea500:continuex,y,w,hcv2.boundingRect(cnt)cv2.rectangle(result,(x,y),(xw,yh),(0,255,0),2)cv2.imshow(Mask,mask)cv2.imshow(Result,result)cv2.waitKey(0)cv2.destroyAllWindows()if__name____main__:process_image(test.png)十二、常用形态学操作对比操作OpenCV函数主要作用常见应用腐蚀cv2.erode()缩小目标去除噪点、消除毛刺膨胀cv2.dilate()放大目标补全断裂、连接区域开运算cv2.MORPH_OPEN去除小噪点图像预处理、噪声过滤闭运算cv2.MORPH_CLOSE填补孔洞修补轮廓、连接目标梯度cv2.MORPH_GRADIENT提取边缘轮廓分析、边缘检测顶帽cv2.MORPH_TOPHAT提取亮目标字符检测、亮点检测黑帽cv2.MORPH_BLACKHAT提取暗目标裂纹、黑色字符检测十三、总结形态学处理是 OpenCV 图像处理中非常重要的一类操作它通过结构元素对目标形状进行调整为后续检测提供更加稳定的输入。在工业视觉项目中形态学处理通常与阈值分割、边缘检测、轮廓分析、模板匹配等算法配合使用。其中开运算适合去除噪声闭运算适合填补空洞而腐蚀和膨胀则用于调整目标的大小和连通性。

相关新闻