【Open CV图像形态学处理技术】边界填充与形态学运算

目录

图片的边界填充

图像形态学核心操作

[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)

运行展示

图像形态学核心操作

前置公共知识点

  1. kernel(卷积核/结构元)

kernel = np.ones((3,3), np.uint8)

生成矩阵,控制腐蚀/膨胀的力度,数值越大,效果越强

  1. iterations:迭代次数,数值越大,腐蚀/膨胀执行越彻底

  2. 图像腐蚀 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次,收缩效果更明显

  1. 图像膨胀 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个白色像素,中心像素就变为白色

最终效果:白色物体向外扩张,填补细小的黑色孔洞

  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)

原理:先腐蚀 → 再膨胀

第一步腐蚀:直接去除白色物体外的细小白色噪点

第二步膨胀:把主体白色物体恢复原有大小

去除图片外部的白色噪点,主体物体几乎不变(指纹图里去除指纹外的白点噪点)

  1. 闭运算 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)

原理:先膨胀 → 再腐蚀

第一步膨胀:填补白色物体内部的细小黑色孔洞、断裂缝隙

第二步腐蚀:把主体白色物体恢复原有大小

填补物体内部的小黑洞、连接断裂的线条(指纹图里把断开的指纹纹路重新连上)

运行展示

形态学进阶三大运算

核心用于提取图像边缘、细微纹理、明暗细节。

  1. 梯度运算 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()

原理

梯度 = 膨胀后的图像 − 腐蚀后的图像

膨胀:白色物体向外扩张,整体变大一圈

腐蚀:白色物体向内收缩,整体缩小一圈

两者相减,只剩下物体的边缘轮廓

作用:突出图像像素剧烈变化的区域,也就是提取物体边缘,可以理解为简易版边缘检测。

运行展示

  1. 顶帽运算 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)

原理

顶帽 = 原始图像 − 开运算结果

原图减去平滑后的开运算结果,只保留比周围更亮的细小纹理

作用:提取背景中细小的白色亮点/纹理,比如图片中的细纹、小光斑。

  1. 黑帽运算 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)

核心原理

黑帽 = 闭运算结果 − 原始图像

闭运算结果减去原图,只保留比周围更暗的细小黑点/缝隙

作用:提取物体内部的细小黑色孔洞、裂缝、暗部细节,比如指纹中断的纹路、物体内部的小黑点。

运行展示

相关推荐
蜡台27 分钟前
大模型算力下放客户端:浏览器/本地设备全落地方案解析
人工智能·ai
冬奇Lab36 分钟前
开源项目第191期:gstack — YC CEO Garry Tan 开源的 AI 虚拟工程团队,23 个专家角色 slash command,从产品构思到上线发布的完整研发流程
人工智能·开源·资讯
冬奇Lab1 小时前
企业知识库系列(03):图增强 RAG 实测——GraphRAG vs HippoRAG
人工智能
MomentYY1 小时前
RAG 索引维护:文档改了,知识库要不要重建?
人工智能·agent·ai编程
土星云SaturnCloud1 小时前
产线SOP动作级AI监管方案:土星云SE110S-WC8赋能合规识别、预警与效率分析
大数据·服务器·人工智能·ai·边缘计算
乐之者v2 小时前
AI人工智能--DeepSeek Harness的安装
人工智能·ai
ai产品老杨2 小时前
边缘计算盒子部署常见问题和排查清单
人工智能·边缘计算
问天_观心2 小时前
零基础在windows环境下的WSL使用llamafactory(二)
人工智能·神经网络·语言模型·github·模型蒸馏