【图像处理】图像形态学操作

参考文章:07-形态学操作

一、图像腐蚀

在图像的形态学操作中,腐蚀主要针对二值图像,使用卷积核的中心点逐个扫描原始图像。被扫描到的原始图像中的像素

点,只有当卷积核对应的元素值均为1(白色)时,其值才为1(白色),否则值为0(黑色)。

腐蚀是对白色部分(高亮部分)而言的,可以理解为删除对象边界的某些像素点,即效果图的高亮区域比原图更小。

函数erodedst = cv2.erode(src, kernel, iterations)

  1. src:源图像
  2. kernel:卷积核
  3. iterations:迭代次数,默认值为1

例如,生成一个5×5的卷积核:

python 复制代码
kernel = np.ones((5,5), np.uint8)
python 复制代码
import cv2
import numpy as np

img = cv2.imread(r"image\erode.bmp", cv2.IMREAD_UNCHANGED)

# 卷积核
kernel = np.ones((5,5), np.uint8)
# 图像腐蚀
erosion = cv2.erode(img, kernel, iterations=5)

cv2.imshow("original", img)
cv2.imshow("erosion", erosion)

cv2.waitKey(0)
cv2.destroyAllWindows()

图像腐蚀的实验结果:

二、图像膨胀

图像膨胀是图像腐蚀的逆操作,也主要针对二值图像。使用卷积核的中心点逐个像素扫描原始图像,被扫描到的原始图像中的像素点,当卷积核对应的元素值只要有一个为1(白色)时,其值就为1(白色),否则值为0(黑色)。

膨胀也是对白色部分(高亮部分)而言的,即效果图的高亮区域比原图更大。

函数dilate

dst = cv2.dilate(src, kernel, iterations)

  1. src:源图像
  2. kernel:卷积核
  3. iterations:迭代次数,默认值为1

例如,生成一个5×5的卷积核:

python 复制代码
kernel = np.ones((5,5), np.uint8)
python 复制代码
import cv2
import numpy as np

img = cv2.imread(r"image\dilation.bmp", cv2.IMREAD_UNCHANGED)

# 卷积核
kernel = np.ones((5,5), np.uint8)
# 图像膨胀
dilation = cv2.dilate(img, kernel, iterations=5)

cv2.imshow("original", img)
cv2.imshow("dilation", dilation)

cv2.waitKey(0)
cv2.destroyAllWindows()

图像膨胀的实验结果:

三、开运算

先腐蚀后膨胀,能够有效去除噪声,并保持原有图像形状不变。

函数morphologyEx
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

  1. img:源图像
  2. cv2.MORPH_OPEN:开运算标识
  3. kernel:卷积核

例如,生成一个5×5的卷积核:

python 复制代码
kernel = np.ones((5,5), np.uint8)
python 复制代码
import cv2
import numpy as np

img = cv2.imread(r"image\opening.bmp", cv2.IMREAD_UNCHANGED)

# 卷积核
kernel = np.ones((10,10), np.uint8)
# 开运算,先腐蚀后膨胀
result = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow("original", img)
cv2.imshow("result", result)

cv2.waitKey(0)
cv2.destroyAllWindows()

开运算的实验结果:

四、闭运算

先膨胀后腐蚀,有助于关闭物体内的小孔,或物体上的小黑点,并保持原有图像形状不变。

函数morphologyEx
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

  1. img:源图像
  2. cv2.MORPH_CLOSE:闭运算标识
  3. kernel:卷积核

例如,生成一个5×5的卷积核:

python 复制代码
kernel = np.ones((5,5), np.uint8)
python 复制代码
import cv2
import numpy as np

img = cv2.imread(r"image\closing.bmp", cv2.IMREAD_UNCHANGED)

# 卷积核
kernel = np.ones((10,10), np.uint8)
# 闭运算,先膨胀后腐蚀
result = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

cv2.imshow("original", img)
cv2.imshow("result", result)

cv2.waitKey(0)
cv2.destroyAllWindows()

闭运算的实验结果:

五、梯度运算

通过对原始图像分别进行膨胀和腐蚀处理,得到梯度图像 = 膨胀图像 - 腐蚀图像。

函数morphologyEx
result = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

  1. img:源图像
  2. cv2.MORPH_GRADIENT:梯度运算标识
  3. kernel:卷积核

例如,生成一个5×5的卷积核:

python 复制代码
kernel = np.ones((5,5), np.uint8)
python 复制代码
import cv2
import numpy as np

img = cv2.imread(r"image\gradient.bmp", cv2.IMREAD_UNCHANGED)

# 卷积核
kernel = np.ones((10,10), np.uint8)
# 梯度运算,梯度图像 = 膨胀图像 - 腐蚀图像
result = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

cv2.imshow("original", img)
cv2.imshow("result", result)

cv2.waitKey(0)
cv2.destroyAllWindows()

梯度运算的实验结果:

六、礼帽操作

通过对原始图像进行开运算处理,得到礼帽图像 = 原始图像 - 开运算图像。

函数morphologyEx
result = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

  1. img:源图像
  2. cv2.MORPH_TOPHAT:礼帽操作标识
  3. kernel:卷积核

例如,生成一个5×5的卷积核:

python 复制代码
kernel = np.ones((5,5), np.uint8)
python 复制代码
import cv2
import numpy as np

img = cv2.imread(r"image\tophat.bmp", cv2.IMREAD_UNCHANGED)

# 卷积核
kernel = np.ones((5,5), np.uint8)
# 礼帽操作,礼帽图像 = 原始图像 - 开运算图像
result = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

cv2.imshow("original", img)
cv2.imshow("result", result)

cv2.waitKey(0)
cv2.destroyAllWindows()

礼帽操作的实验结果:

七、黑帽操作

通过对原始图像进行闭运算处理,得到黑帽图像 = 闭运算图像 - 原始图像。

函数morphologyEx
result = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

  1. img:源图像
  2. cv2.MORPH_BLACKHAT:黑帽操作标识
  3. kernel:卷积核

例如,生成一个5×5的卷积核:

python 复制代码
kernel = np.ones((5,5), np.uint8)
python 复制代码
import cv2
import numpy as np

img = cv2.imread(r"image\blackhat.bmp", cv2.IMREAD_UNCHANGED)

# 卷积核
kernel = np.ones((10,10), np.uint8)
# 黑帽操作,黑帽图像 = 闭运算图像 - 原始图像
result = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

cv2.imshow("original", img)
cv2.imshow("result", result)

cv2.waitKey(0)
cv2.destroyAllWindows()

黑帽操作的实验结果:

更多资料:https://github.com/0voice

相关推荐
承渊政道6 分钟前
【从零开始大模型开发与微调:基于PyTorch与ChatGLM】(从退化问题到信息高速公路:ResNet残差网络实战拆解)
网络·人工智能·pytorch·深度学习·resnet·chatglm·卷积
大鱼>11 分钟前
宠物行为识别AI算法详解:从数据采集到模型部署的完整方案
人工智能·深度学习·算法·宠物
doiito(Do It Together)14 分钟前
【开源项目】Rust 重构 TTS 引擎:kokoroi-rs 的高性能流水线架构揭秘
人工智能
王莎莎-MinerU15 分钟前
解析回归集:RAG 和 Agent 上线前,先把表格、公式、版面测清楚
人工智能·算法·数据挖掘·回归·pdf·ocr
AI服务老曹16 分钟前
Docker部署AI视频分析平台项目实战记录
人工智能·docker·音视频
KaMeidebaby20 分钟前
卡梅德生物技术快报|兔单克隆抗体:噬菌体 Fab 免疫文库搭建实操:兔单克隆抗体重组构建完整参数
前端·网络·数据库·人工智能·算法
AndrewHZ22 分钟前
【LLM技术全景】混合精度与分布式训练:训练大模型的工程奥秘
人工智能·分布式·深度学习·算法·ai·语言模型·llm
万岳科技程序员小金23 分钟前
真人数字人小程序如何开发?AI数字人平台搭建流程全面解析
人工智能·小程序·ai数字人系统源码·ai数字人平台搭建·ai数字人小程序开发
吴佳浩29 分钟前
为什么 MCP、Skill、RAG 能工作?从 Conversation Loop 看现代 Agent 的底层架构
人工智能·llm·agent
2501_9139817830 分钟前
AI与边缘计算助力视频监控与智能预警安防物联网方案
人工智能·音视频·边缘计算·智能安防监控