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

核心原理

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

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

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

运行展示

相关推荐
竹之月5 分钟前
MCGS昆仑通态触摸屏背景图分辨率太大,告警解决
人工智能·经验分享
kaka.liulin -study29 分钟前
Colulu Agents Workflow:业财一体化分析示例
人工智能·数据分析·multi agents
企业解惑小能手-域智盾系统33 分钟前
实战教程:企业终端如何监控AI对话记录,落地影子AI风险治理
人工智能·域智盾
问商十三载1 小时前
GEO优化有用吗?基于检索与信源机制的有效性分析
大数据·人工智能·机器学习
m4Rk_8 小时前
【论文阅读】Agent 记忆机制(83):Inside Out——用可演化 PersonaTree 构建 Agent 的核心长期记忆
论文阅读·人工智能·学习·开源·github
运行时异常8 小时前
【WMS 仓储系统集成 AI Agent 实战】第 8 讲(终篇):生产部署与并发安全——Semaphore 放进 Flux.defer 的坑,压测抓了一晚上
人工智能·安全
杨杨杨大侠8 小时前
Jev、Kev、Laya:决策模型怎么选,什么时候需要微调?
人工智能·python·agent
代码方舟8 小时前
零信任架构实战:基于天远人企关联构建自动化供应链金融网关
运维·人工智能·架构·自动化
虹科网络安全8 小时前
“顶会”看安全(十八):超越越狱:揭示由能力边界模糊引发的 LLM 应用安全风险
人工智能·安全
Maiko Star8 小时前
* LangChain 提示词模板详解:ChatPromptTemplate 的使用与高级特性
java·人工智能·langchain