深度学习-OpenCv的运用(4)

文章目录

一、图像形态学

图像形态学是数学中研究形状、结构和变换的一个分支,在图像处理领域,它主要用于描述和分析图像中的形状和结构。图像形态学通过操作图像中的形状和结构元素(也称为内核或模板),来实现图像的分析、增强、去噪和特征提取等目的。这一领域为计算机视觉、图像识别和医学图像处理等领域提供了强大的工具和方法。

二、图像形态学的基本概念

  • 结构元素(Structuring Element):结构元素是形态学操作的基本组成部分,它定义了形态学操作的形状和大小。通常是一个小的矩形、圆形或其他形状的核。在腐蚀和膨胀等操作中,结构元素在图像上滑动并与图像进行匹配,用来确定操作的范围。
  • 腐蚀(Erosion):腐蚀是一种形态学操作,它通过结构元素对图像进行局部最小值滤波,使图像中边界部分逐渐缩小。腐蚀操作可以用于去除图像中的噪声、分割物体等。
  • 膨胀(Dilation):膨胀是一种形态学操作,它通过结构元素对图像进行局部最大值滤波,使图像中的边界部分逐渐扩张。膨胀操作可以用于填充图像中的空洞、连接物体等。

三、形态学操作的主要类型

  • 腐蚀(Erosion):
    • 原理:使用结构元素在图像上滑动,只有当结构元素范围内的像素全部满足条件(如全为前景色)时,中心像素才保持不变,否则被置为背景色。
    • 应用:消除小型噪声、分离接触对象、细化物体边缘等。
  • 膨胀(Dilation):
    • 原理:使用结构元素在图像上滑动,只要结构元素与图像中的任何一个像素相交,中心像素就被设置为前景色。
    • 应用:填充图像中的空洞、连接相邻的对象、消除图像中的小黑点等。
  • 开运算(Opening):
    • 定义:先进行腐蚀操作,再进行膨胀操作的组合。
    • 应用:消除小型噪声、平滑较大物体的边界而不明显改变其面积。
  • 闭运算(Closing):
    • 定义:先进行膨胀操作,再进行腐蚀操作的组合。
    • 应用:填充物体间的小空洞、连接邻近的断裂物体等。
  • 形态学梯度(Morphological Gradient):
    • 定义:膨胀图像与腐蚀图像的差异,用于检测图像中的边缘和轮廓。
  • 顶帽运算(Top Hat)与底黑帽运算(Black Hat):
    • 顶帽运算是原始图像与开运算之间的差异,用于提取比原始图像更亮的区域。
    • 黑帽运算是闭运算与原始图像之间的差异,用于提取比原始图像更暗的区域。

四、代码实现

1.图像腐蚀

python 复制代码
import cv2
import numpy as np
sun = cv2.imread('sun.png')
cv2.imshow('a', sun)
cv2.waitKey(0)

kernel = np.ones((5, 5), np.uint8) #设置kenenel大小
erosion_1 = cv2.erode(sun, kernel, iterations=2) #kenenel大小默认为3*3 iterations默认为1
cv2.imshow('erosion_1', erosion_1)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 代码解释:设置了结构元素的大小为 5x5,并指定了腐蚀操作的迭代次数为 2。这意味着腐蚀操作将连续进行两次,每次都会使用5x5 的结构元素来减少图像中的亮区域。
  • 显示结果:使用 cv2.imshow 来显示原始图像和腐蚀后的图像。
  • 关闭窗口:在显示图像后,使用 cv2.waitKey(0)来等待用户按键。在 cv2.waitKey(0) 之后,调用cv2.destroyAllWindows() 来关闭所有 OpenCV 创建的窗口。

2.图像膨胀

python 复制代码
import cv2
import numpy as np
wenzi = cv2.imread('word.png')
cv2.imshow('b', 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)
cv2.destroyAllWindows()
  • 读取并显示文件:使用cv2.imread函数读取名为'word.png'的图像文件,并将其存储在变量wenzi中,显示图像,窗口标题为'b',图像为wenzi 。
  • 图像膨胀:创建一个2x2的结构元素,所有元素的值都设为1,这个结构元素将用于图像膨胀操作 ,使用cv2.dilate函数对wenzi图像进行两次膨胀操作。
  • 显示图像:使用cv2.imshow函数显示膨胀后的图像,窗口标题为'wenzi-new' ,最后关闭窗口。

3.开运算-先腐蚀后膨胀

python 复制代码
import cv2
import numpy as np
zhiwen = cv2.imread('zhiwen1.png')
cv2.imshow('a1',zhiwen)
cv2.waitKey(0)

kernel = np.ones((2,2),np.uint8)
zhiwen_new = cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel)
cv2.imshow('b1',zhiwen_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 读取并显示文件:读取名为'zhiwen1.png'的图像文件,并将其存储在变量zhiwen中,使用cv2.imshow函数显示原始图像,窗口标题为'a1' 。
  • 开运算操作:创建一个2x2的结构元素,所有元素的值都设为1,使用cv2.morphologyEx函数对zhiwen图像进行形态学开运算。
  • 显示图像:使用cv2.imshow函数显示形态学开运算后的图像,窗口标题为'b1',关闭所有OpenCV创建的窗口 。

4.闭运算-先膨胀后腐蚀

python 复制代码
import cv2
import numpy as np
zhiwen = cv2.imread('zhiwen2.png')
cv2.imshow('a2',zhiwen)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
zhiwen_new = cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel)
cv2.imshow('b2',zhiwen_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 读取图像:使用cv2.imread函数读取名为zhiwen2.png的图像文件,并将其存储在变量zhiwen中。使用cv2.imshow函数显示原始图像。第一个参数是窗口的标题,这里设置为'a2',第二个参数是要显示的图像,即zhiwen。
  • 闭运算操作:创建一个2x2的结构元素(或称为核),所有元素的值都设为1。这个结构元素将用于形态学操作。使用函数对zhiwen图像进行形态学闭运算。
  • 显示图像:使用cv2.imshow函数显示形态学开运算后的图像。窗口标题设置为'b2',关闭所有由OpenCV创建的窗口。

5.梯度运算

python 复制代码
word = cv2.imread('word.png')
cv2.imshow('a',word)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
#膨胀
pz_word = cv2.dilate(word,kernel,iterations=2)
cv2.imshow('b',pz_word)
cv2.waitKey(0)
#腐蚀
fs_word = cv2.erode(word,kernel,iterations=1)
cv2.imshow('c',fs_word)
cv2.waitKey(0)
# 膨胀-腐蚀
word_new = cv2.morphologyEx(word,cv2.MORPH_GRADIENT,kernel)
cv2.imshow('d',word_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 膨胀操作(cv2.dilate)会扩大图像中的亮区域(或白色区域),通常用于增强前景物体或连接相邻的亮区域。
  • 腐蚀操作(cv2.erode)会缩小图像中的亮区域,通常用于去除小的白噪声或前景物体上的小黑点。
  • 形态学梯度(cv2.MORPH_GRADIENT)是膨胀后的图像与腐蚀后的图像之间的差异。它通常用于突出显示图像中物体的边缘,因为边缘区域在膨胀和腐蚀操作中会经历最大的变化。

6.顶帽与黑帽

python 复制代码
sun = cv2.imread('sun.png')
cv2.imshow('a', sun)
cv2.waitKey(0)

kernel = np.ones((2, 2), np.uint8)
# 开运算
open_sun = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)
cv2.imshow('b', open_sun)
cv2.waitKey(0)
# 顶帽
tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('c', tophat)
cv2.waitKey(0)

# 闭运算
close_sun = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)
cv2.imshow('d', close_sun)
cv2.waitKey(0)
# 黑帽
blackhat = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('e', blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 读取并显示图像:使用cv2.imread函数读取名为sun.png的图像文件,并将其存储在变量sun中。使用cv2.imshow函数在窗口中显示原始图像,窗口标题为'a'。
  • 定义结构元素:创建一个2x2的结构元素(或称为核),所有元素的值都设为1,数据类型为np.uint8。这个结构元素将用于后续的形态学变换。
  • 开运算:使用cv2.morphologyEx函数对图像进行开运算。开运算是先腐蚀后膨胀的过程,用于去除小的前景物体或噪声,同时保持前景物体的总体位置和形状不变。结果存储在open_sun中。使用cv2.imshow函数显示开运算后的图像,窗口标题为'b'。
  • 顶帽变换:使用cv2.morphologyEx函数对图像进行顶帽变换。顶帽变换是原始图像与开运算结果之间的差异,用于分离比周围亮的区域,通常用于突出显示图像的亮区域或前景物体。结果存储在tophat中。使用cv2.imshow函数显示顶帽变换后的图像,窗口标题为'c'。
  • 闭运算:使用cv2.morphologyEx函数对图像进行闭运算。闭运算是先膨胀后腐蚀的过程,用于填充前景物体内部的小孔或小黑点,同时保持前景物体的总体位置和形状不变。结果存储在close_sun中。使用cv2.imshow函数显示闭运算后的图像,窗口标题为'd'。
  • 黑帽变换:使用cv2.morphologyEx函数对图像进行黑帽变换。黑帽变换是闭运算结果与原始图像之间的差异,用于分离比周围暗的区域,通常用于突出显示图像的暗区域或背景。结果存储在blackhat中。使用cv2.imshow函数显示黑帽变换后的图像,窗口标题为'e'。
  • 关闭所有窗口:使用cv2.destroyAllWindows函数关闭所有由OpenCV创建的窗口。

五、总结

图像形态学是数字图像处理中的一个重要分支,它通过一系列形态学操作实现对图像形状和结构的分析和处理。在OpenCV等计算机视觉库中,形态学操作被广泛应用于图像去噪、边缘检测、特征提取等任务中。

相关推荐
摘星编程1 小时前
CANN内存管理机制:从分配策略到性能优化
人工智能·华为·性能优化
likerhood2 小时前
3. pytorch中数据集加载和处理
人工智能·pytorch·python
Robot侠2 小时前
ROS1从入门到精通 10:URDF机器人建模(从零构建机器人模型)
人工智能·机器人·ros·机器人操作系统·urdf机器人建模
haiyu_y2 小时前
Day 46 TensorBoard 使用介绍
人工智能·深度学习·神经网络
阿里云大数据AI技术2 小时前
DataWorks 又又又升级了,这次我们通过 Arrow 列存格式让数据同步速度提升10倍!
大数据·人工智能
做科研的周师兄2 小时前
中国土壤有机质数据集
人工智能·算法·机器学习·分类·数据挖掘
IT一氪2 小时前
一款 AI 驱动的 Word 文档翻译工具
人工智能·word
lovingsoft2 小时前
Vibe coding 氛围编程
人工智能
百***07452 小时前
GPT-Image-1.5 极速接入全流程及关键要点
人工智能·gpt·计算机视觉
yiersansiwu123d2 小时前
AI二创的版权迷局与健康生态构建之道
人工智能