目录
[1. 图像腐蚀 cv2.erode()](#1. 图像腐蚀 cv2.erode())
[2. 图像膨胀 cv2.dilate()](#2. 图像膨胀 cv2.dilate())
[3. 开运算 cv2.morphologyEx(..., cv2.MORPH_OPEN)](#3. 开运算 cv2.morphologyEx(..., cv2.MORPH_OPEN))
[4. 闭运算 cv2.morphologyEx(..., cv2.MORPH_CLOSE)](#4. 闭运算 cv2.morphologyEx(..., cv2.MORPH_CLOSE))
[1. 梯度运算 MORPH_GRADIENT](#1. 梯度运算 MORPH_GRADIENT)
[2. 顶帽运算 TOPHAT](#2. 顶帽运算 TOPHAT)
[3. 黑帽运算 BLACKHAT](#3. 黑帽运算 BLACKHAT)
图片的边界填充
cv2.copyMakeBorder()是OpenCV库中的一个函数,用于给图像添加额外的边界(padding)。
copyMakeBorder(src: UMat, top: int, bottom: int, left: int, right: int, borderType: int, dst: UMat | None = ..., value: cv2.type)
它有以下几个参数:
- src:要扩充边界的原始图像。
- top, bottom, left, right:相应方向上的边框宽度。
- borderType:定义要添加边框的类型
其中边框类型有以下几种:
- cv2.BORDER_CONSTANT:添加的边界框像素值为常数(需要额外再给一个参数)。
- cv2.BORDER_REFLECT:添加的边框像素将是边界元素的镜面反射,类似于gfedcba|abcdefgh|hgfedcba。(交界处也复制了)
- cv2.BORDER_REFLECT_101 或 cv2.BORDER_DEFAULT:和上面类似,但是有一些细微的不同,类似于gfedcb|abcdefgh|gfedcba (交接处删除了)
- cv2.BORDER_REPLICATE:使用最边界的像素代替,类似于aaaaaa|abcdefgh|hhhhhhh
- cv2.BORDER_WRAP:上下左右依次替换,类似于cdefgh|abcdefgh|abcdefg
代码展示
python
import cv2
ys = cv2.imread('yueshan.png')
# ys=cv2.resize(ys,dsize=None,fx=0.5,fy=0.5) # 图片缩放
# ys=cv2.resize(ys,(640,480))
top,bottom,left,right = 50,50,50,50
constant = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_CONSTANT,value=(229,25,80))
reflect = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REFLECT_101)
replicate = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_WRAP)
cv2.imshow(winname='yuantu', ys)
cv2.waitKey(0)
cv2.imshow(winname='CONSTANT', constant)
cv2.waitKey(0)
cv2.imshow(winname='REFLECT', reflect)
cv2.waitKey(0)
cv2.imshow(winname='REFLECT_101', reflect101)
cv2.waitKey(0)
cv2.imshow(winname='REPLICATE', replicate)
cv2.waitKey(0)
cv2.imshow(winname='WRAP', wrap)
cv2.waitKey(0)
运行展示

图像形态学核心操作
前置公共知识点
- kernel(卷积核/结构元)
kernel = np.ones((3,3), np.uint8)
生成矩阵,控制腐蚀/膨胀的力度,数值越大,效果越强
-
iterations:迭代次数,数值越大,腐蚀/膨胀执行越彻底
-
图像腐蚀 cv2.erode()
python
sun = cv2.imread('sun.png')
cv2.imshow('src',sun)
cv2.waitKey(0)
kernel = np.ones((3,3),np.uint8)
erosion_1 = cv2.erode(sun,kernel,iterations=2)
cv2.imshow('erosion_1',erosion_1)
cv2.waitKey(0)
核心原理
蚕食白色物体的边缘,让白色区域整体缩小,遍历图片所有像素,只要卷积核内存在1个黑色像素,中心像素就变为黑色
最终效果:白色物体向内收缩,边缘毛刺被磨掉,细小的白色区域会直接消失,去除白色物体边缘的细小噪点、毛刺
代码参数
kernel=(3,3):3×3卷积核,控制腐蚀范围
iterations=2:连续腐蚀2次,收缩效果更明显
- 图像膨胀 cv2.dilate()
python
wenzi = cv2.imread('wenzi.png')
cv2.imshow('src1',wenzi)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
wenzi_new = cv2.dilate(wenzi,kernel,iterations=2)
cv2.imshow('wenzi_new',wenzi_new)
cv2.waitKey(0)
核心原理
扩充白色物体的边缘,让白色区域整体变大,遍历图片所有像素,只要卷积核内存在1个白色像素,中心像素就变为白色
最终效果:白色物体向外扩张,填补细小的黑色孔洞
- 开运算 cv2.morphologyEx(..., cv2.MORPH_OPEN)
python
zhiwen = cv2.imread('zhiwen.png')
cv2.imshow('src2',zhiwen)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
zhiwen_new = cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel)
cv2.imshow('zhiwen_new',zhiwen_new)
cv2.waitKey(0)
原理:先腐蚀 → 再膨胀
第一步腐蚀:直接去除白色物体外的细小白色噪点
第二步膨胀:把主体白色物体恢复原有大小
去除图片外部的白色噪点,主体物体几乎不变(指纹图里去除指纹外的白点噪点)
- 闭运算 cv2.morphologyEx(..., cv2.MORPH_CLOSE)
python
zhiwen_duan = cv2.imread('zhiwen_duan.png')
cv2.imshow('src3',zhiwen_duan)
cv2.waitKey(0)
kernel = np.ones((4,4),np.uint8)
zhiwen_new = cv2.morphologyEx(zhiwen_duan,cv2.MORPH_CLOSE,kernel)
cv2.imshow('zhiwen_new1',zhiwen_new)
cv2.waitKey(0)
原理:先膨胀 → 再腐蚀
第一步膨胀:填补白色物体内部的细小黑色孔洞、断裂缝隙
第二步腐蚀:把主体白色物体恢复原有大小
填补物体内部的小黑洞、连接断裂的线条(指纹图里把断开的指纹纹路重新连上)
运行展示

形态学进阶三大运算
核心用于提取图像边缘、细微纹理、明暗细节。
- 梯度运算 MORPH_GRADIENT
python
wenzi = cv2.imread('wenzi.png')
cv2.imshow('wenzi',wenzi)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
# 膨胀
pz_wenzi=cv2.dilate(wenzi,kernel,iterations=1)
cv2.imshow('pz_wenzi',pz_wenzi)
cv2.waitKey(0)
# 腐蚀
fs_wenzi=cv2.erode(wenzi,kernel,iterations=1)
cv2.imshow('fs_wenzi',fs_wenzi)
cv2.waitKey(0)
# 梯度运算 = 膨胀结果 − 腐蚀结果
gradient = cv2.morphologyEx(wenzi,cv2.MORPH_GRADIENT,kernel)
cv2.imshow('gradient',gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
原理
梯度 = 膨胀后的图像 − 腐蚀后的图像
膨胀:白色物体向外扩张,整体变大一圈
腐蚀:白色物体向内收缩,整体缩小一圈
两者相减,只剩下物体的边缘轮廓
作用:突出图像像素剧烈变化的区域,也就是提取物体边缘,可以理解为简易版边缘检测。
运行展示

- 顶帽运算 TOPHAT
python
sun = cv2.imread('sun.png')
cv2.imshow('sun_yuantu',sun)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
# 开运算:先腐蚀 → 再膨胀
open_sun=cv2.morphologyEx(sun,cv2.MORPH_OPEN,kernel)
cv2.imshow('open_sun',open_sun)
cv2.waitKey(0)
# 顶帽运算 = 原图 − 开运算结果
tophat = cv2.morphologyEx(sun,cv2.MORPH_TOPHAT,kernel)
cv2.imshow('TOPHAT',tophat)
cv2.waitKey(0)
原理
顶帽 = 原始图像 − 开运算结果
原图减去平滑后的开运算结果,只保留比周围更亮的细小纹理
作用:提取背景中细小的白色亮点/纹理,比如图片中的细纹、小光斑。
- 黑帽运算 BLACKHAT
python
# 闭运算:先膨胀 → 再腐蚀
close_sun=cv2.morphologyEx(sun,cv2.MORPH_CLOSE,kernel)
cv2.imshow('close_sun',close_sun)
cv2.waitKey(0)
# 黑帽运算 = 闭运算结果 − 原图
blackhat = cv2.morphologyEx(sun,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow('BLACKHAT',blackhat)
cv2.waitKey(0)
核心原理
黑帽 = 闭运算结果 − 原始图像
闭运算结果减去原图,只保留比周围更暗的细小黑点/缝隙
作用:提取物体内部的细小黑色孔洞、裂缝、暗部细节,比如指纹中断的纹路、物体内部的小黑点。
运行展示
