机器学习:opencv--图像形态学

目录

前言

一、常用形态学操作

二、腐蚀和膨胀

1.图像腐蚀

2.图形膨胀

三、开运算和闭运算

1.开运算

2.闭运算

四、顶帽和黑帽

1.顶帽

2.黑帽

五、梯度运算

总结


前言

图像形态学是一种用于处理和分析图像形状和结构的技术。

一、常用形态学操作

  1. 膨胀(Dilation):扩展前景区域,使对象变大。
  2. 腐蚀(Erosion):缩小前景区域,去除小的噪声点。
  3. 开运算(Opening):先腐蚀后膨胀,用于去除小物体。
  4. 闭运算(Closing):先膨胀后腐蚀,用于填充小孔洞。
  5. 顶帽(Top-hat):原图像与开运算结果的差异。用于提取图像中比背景亮的细节,通常用于突出小的亮区域。
  6. 黑帽(Black-hat):闭运算结果与原图像的差异。用于提取图像中比背景暗的细节,通常用于突出小的暗区域。
  7. 梯度运算:梯度运算实际上是膨胀操作减去腐蚀操作的结果。

二、腐蚀和膨胀

1.图像腐蚀

  • 缩小前景区域,去除小的噪声点。
python 复制代码
import numpy as np
import cv2

"""
图像腐蚀
dst = cv2.erode(src, kernel, dst,anchor,iterations,borderType,borderValue)
"""
sun = cv2.imread('sun.png')
cv2.imshow('sun', sun)
cv2.waitKey(0)

kernel = np.ones((2, 2), np.uint8)  # 设置kernel大小
erosion_1 = cv2.erode(sun, kernel, iterations=5)
cv2.imshow('erode', erosion_1)
cv2.waitKey(0)

输出:

  • 左边是原图,右边是腐蚀之后的

2.图形膨胀

  • 扩展前景区域,使对象变大。
python 复制代码
import numpy as np
import cv2

"""
图像膨胀
dst = cv2.dilate(img, kernel,iteration)
"""
text = cv2.imread('eng_text.png')
cv2.imshow('text', text)
cv2.waitKey(0)

kernel = np.ones((2, 2), np.uint8)
text_new = cv2.dilate(text, kernel, iterations=3)
cv2.imshow('dilate', text_new)
cv2.waitKey(0)

输出:

  • 左边是原图,右边是膨胀之后的图像

三、开运算和闭运算

1.开运算

  • 先腐蚀后膨胀,用于去除小物体。
python 复制代码
# 开运算 先腐蚀后膨胀
zw_noise = cv2.imread('zw_noise.png')
cv2.imshow('zw_noise', zw_noise)
cv2.waitKey(0)

kernel = np.ones((2, 2), np.uint8)
zw_open = cv2.morphologyEx(zw_noise, cv2.MORPH_OPEN, kernel)  # 先腐蚀 后膨胀
cv2.imshow('zw_open', zw_open)
cv2.waitKey(0)

输出:

  • 左边是原图,右边是进行开运算之后的图片

2.闭运算

  • 先膨胀后腐蚀,用于填充小孔洞。
python 复制代码
zw = cv2.imread('zw.png')
cv2.imshow('zw', zw)
cv2.waitKey(0)

kernel = np.ones((5, 5), np.uint8)
zw_close = cv2.morphologyEx(zw, cv2.MORPH_CLOSE, kernel)  # 先腐蚀 后膨胀
cv2.imshow('zw_close', zw_close)
cv2.waitKey(0)

输出:

  • 左边是原图,右边是经过闭运算之后的图
  • 可以看出来指纹有些断开的地方连接起来了

四、顶帽和黑帽

1.顶帽

  • 原图像与开运算结果的差异。用于提取图像中比背景亮的细节,通常用于突出小的亮区域。
python 复制代码
sun = cv2.imread('sun.png')
cv2.imshow('sun', 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)
cv2.destroyAllWindows()

输出:

  • 左边原图,中间开运算,右边顶帽运算
  • 顶帽之后有种凹陷的感觉

2.黑帽

  • 闭运算结果与原图像的差异。用于提取图像中比背景暗的细节,通常用于突出小的暗区域。
python 复制代码
sun = cv2.imread('sun.png')
cv2.imshow('sun', sun)
cv2.waitKey(0)
kernel = np.ones((2, 2), np.uint8)
cv2.imshow('sun', sun)
cv2.waitKey(0)
# 闭运算
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)

输出:

  • 左边原图,中间闭运算,右边黑帽之后的图片

五、梯度运算

  • 用于提取图像的边缘,计算图像的变化率。
python 复制代码
"""
梯度运算: 膨胀-腐蚀
"""
text = cv2.imread('eng_text.png')
# cv2.imshow('text', text)
# cv2.waitKey(0)

kernel = np.ones((2, 2), np.uint8)
# 膨胀
pz_text = cv2.dilate(text, kernel, iterations=2)
cv2.imshow('pz_text', pz_text)
cv2.waitKey(0)
# 腐蚀
fs_text = cv2.erode(text, kernel, iterations=2)
cv2.imshow('fs_text', fs_text)
cv2.waitKey(0)
# 膨胀-腐蚀
text_new = cv2.morphologyEx(text, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('text_new', text_new)
cv2.waitKey(0)

输出:

  • 左边是膨胀的图片,中间是腐蚀的图片,右边是梯度运算之后的图片
  • 有一种镂空的感觉

总结

这些处理方法主要用于图像的边缘检测和特征增强。通过膨胀,图像的前景区域会被扩展,填补细小的空洞;通过腐蚀,前景区域会被缩小,去除噪声。梯度运算(膨胀减腐蚀)则能够突出图像中的边缘信息,有助于识别和分析图像中的结构和形状。

相关推荐
有为少年3 小时前
Welford 算法 | 优雅地计算海量数据的均值与方差
人工智能·深度学习·神经网络·学习·算法·机器学习·均值算法
GISer_Jing3 小时前
跨境营销前端AI应用业务领域
前端·人工智能·aigc
Ven%3 小时前
从单轮问答到连贯对话:RAG多轮对话技术详解
人工智能·python·深度学习·神经网络·算法
OpenCSG3 小时前
OpenCSG社区:激发城市AI主权创新引擎
人工智能·opencsg·agentichub
大厂技术总监下海3 小时前
没有千卡GPU,如何从0到1构建可用LLM?nanoChat 全栈实践首次公开
人工智能·开源
机器之心3 小时前
谁还敢说谷歌掉队?2025年,它打了一场漂亮的翻身仗
人工智能·openai
元智启3 小时前
企业AI智能体加速产业重构:政策红利与场景落地双轮驱动——从技术验证到价值交付的范式跃迁
人工智能·重构
智算菩萨3 小时前
强化学习从单代理到多代理系统的理论与算法架构综述
人工智能·算法·强化学习
San30.3 小时前
从零到一:开启 LangChain 的 AI 工程化之旅
人工智能·langchain·node.js
机器之心3 小时前
字节做了个 AI 手机,钉钉做了台 AI 主机
人工智能·openai