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

核心原理

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

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

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

运行展示

相关推荐
Lei活在当下5 小时前
【AI手记系列-2026/6/18】iSparto & Harness,Caveman 以及AI时代的生存指南
人工智能·llm·openai
冬奇Lab7 小时前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
冬奇Lab7 小时前
Agent 系列(22):Context Engineering 深度——三种上下文管理策略的量化对比
人工智能·agent
hboot7 小时前
AI工程师第二课 - 数据处理
人工智能·python·数据分析
程序员cxuan7 小时前
DeepSeek 杀入多模态,识图功能正式上线!
人工智能·后端·程序员
米小虾9 小时前
告别单打独斗:2026年多Agent协作架构实战指南
人工智能·agent
IT_陈寒10 小时前
SpringBoot这个自动配置坑我跳了三次
前端·人工智能·后端
Larcher11 小时前
AI Loop:让AI像人一样自主完成任务的核心机制
javascript·人工智能·设计模式
牧艺11 小时前
从零到协同:构建类飞书在线文档系统的五个技术重难点
前端·人工智能