OpenCV-python形态学及图像的开闭运算
形态学图像处理的基本运算有:
-
膨胀和腐蚀(膨胀区域填充,腐蚀分割区域)
-
开运算和闭运算(开运算去除噪点,闭运算填充内部孔洞)
-
击中与击不中
-
顶帽变换,黑帽变换
形态学的应用:消除噪声、边界提取、区域填充、连通分量提取、凸壳、细化、粗化等;分割出独立的图像元素,或者图像中相邻的元素;求取图像中明显的极大值区域和极小值区域;求取图像梯度
知识重点
- 二值化操作 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY),对灰度图像操作, 全局阈值,整幅图像采用同一个数作为阈值 。
-
自适应阈值二值化 dst = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 9, 7) 此时的阈值是根据图像上的每一个小区域计算与其对应的阈值 。
- 腐蚀操作 dst = cv2.erode(img, kernel, iterations = 2) 腐蚀操作也是用卷积核扫描图像, 去除图片中的噪点, 只不过腐蚀操作的卷积和一般都是1, 如果卷积核内所有像素点都是白色, 那么锚点即为白色. iterations是腐蚀操作的迭代次数, 次数越多, 腐蚀效果越明显 。
-
getStructuringElement(shape, ksize[, anchor]) opencv提供了获取卷积核的api.不需要我们手工创建卷积核.shape是指卷积核的形状, 注意不是指长宽, 是指卷积核中1形成的形状.
-
- 膨胀操作 dst = cv2.dilate(img, kernel, iterations = 1) 实现对图像的膨胀操作
- 开运算 dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) 开运算 = 腐蚀 + 膨胀 去除图像外部的噪点 .
- 闭运算 dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) 闭运算 = 膨胀 + 腐蚀 填充图像内部的噪点 .
- 形态学梯度 dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) 梯度 = 原图 - 腐蚀, 腐蚀之后原图边缘变小了, 原图 - 腐蚀 就可以得到腐蚀掉的部分, 即边缘.
- 顶帽运算 dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel,iterations = 2) 顶帽 = 原图 - 开运算 开运算的效果是去除图像外的噪点, 原图 - 开运算就得到了去掉的噪点.
- 黑帽操作 dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel,iterations = 2)
- 黑帽 = 原图 - 闭运算 闭运算可以将图形内部的噪点去掉, 那么原图 - 闭运算的结果就是图形内部的噪点
Mat kernel = getStructuringElement(int shape,Size ksize,Point anchor); shape //结构元素的定义:形状 (MORPH_RECT \MORPH_CROSS(交叉形) \MORPH_ELLIPSE); ksize //结构元素大小; anchor //锚点 默认是Point(-1, -1)意思就是中心像素,也可以自己指定
高阶形态学变换
void morphologyEx( InputArray src, //输入图像 OutputArray dst, //输出图像 int op, //形态学运算类型 InputArray kernel, //结构元素 Point anchor = Point(-1,-1), //锚点 int iterations = 1, //运算次数 int borderType = BORDER_CONSTANT, )
对于输入参数op(形态学运算类型)有以下几种参数可以设置:
-
MORPH_ERODE(腐蚀)
-
MORPH_DILATE(膨胀)
-
MORPH_OPEN(开运算)
-
MORPH_CLOSE(闭运算)
-
MORPH_GRADIENT(形态学梯度,即膨胀图减腐蚀图)
-
MORPH_TOPHAT(顶帽运算)
-
MORPH_BLACKHAT(底帽运算)
-
MORPH_HITMISS(击中与击不中)
顶帽运算就是求原图与原图的开运算的差值图像。作用:
1️⃣:得到开运算消除的区域(检查开运算效果)
2️⃣:校正不均匀光照的影响(用于暗背景上的亮物体,去光差)
Mat src1 = imread("D:/opencv练习图片/开运算.png"); Mat src_open, src_tophat; imshow("原图", src1); Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1)); morphologyEx(src1, src_open, MORPH_OPEN, kernel,Point(-1, -1));//开运算 morphologyEx(src1, src_tophat, MORPH_TOPHAT, kernel, Point(-1, -1));//顶帽运算 imshow("开运算", src_open); imshow("顶帽运算", src_tophat);
Mat src1 = imread("D:/opencv练习图片/闭运算.png"); Mat src_close, src_blackhat; imshow("原图", src1); Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1)); morphologyEx(src1, src_close, MORPH_CLOSE, kernel,Point(-1, -1));//闭运算 morphologyEx(src1, src_blackhat, MORPH_BLACKHAT, kernel, Point(-1, -1));//底帽运算 imshow("闭运算", src_close); imshow("底帽运算", src_blackhat);
底帽运算就是求原图与原图的闭运算的差值图像。作用:
1️⃣:闭运算是去噪点的过程,所以黑帽操作实质上保留的是噪点的部分。
2️⃣:校正不均匀光照的影响(用于亮(白)背景上的暗物体)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!