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

核心原理

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

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

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

运行展示

相关推荐
星辰AI10 小时前
数据质量检查:保障 AI 训练数据的可靠性
人工智能·ai·语言模型
何玺10 小时前
从电商到“物理世界运营商”:京东AI的未来推演与护城河量化
人工智能
阿奇__10 小时前
基于 Node.js 与智谱 AI 的 RAG 工程实践
人工智能·node.js
海兰10 小时前
【文字三国志:第二篇】天命重构,系统架构与核心设计文档
人工智能·语言模型
枫叶林FYL11 小时前
Explore with Long-term Memory:基于多模态大语言模型与强化学习的具身探索框架
大数据·人工智能·语言模型
有为少年11 小时前
深度隐式层 | 深度平衡模型 (Deep Equilibrium, DEQ)
人工智能·深度学习·神经网络·机器学习
完成大叔11 小时前
学习导师:从工具模式到感知模式的整合
人工智能
梦想三三11 小时前
【Open CV图像处理】修改运算与平滑处理
人工智能·opencv·计算机视觉