当前位置: 首页 > news >正文

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

文章目录

  • 一、图像形态学
  • 二、图像形态学的基本概念
  • 三、形态学操作的主要类型
  • 四、代码实现
    • 1.图像腐蚀
    • 2.图像膨胀
    • 3.开运算-先腐蚀后膨胀
    • 4.闭运算-先膨胀后腐蚀
    • 5.梯度运算
    • 6.顶帽与黑帽
  • 五、总结

一、图像形态学

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

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

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

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

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

四、代码实现

1.图像腐蚀

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.图像膨胀

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.开运算-先腐蚀后膨胀

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.闭运算-先膨胀后腐蚀

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.梯度运算

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.顶帽与黑帽

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等计算机视觉库中,形态学操作被广泛应用于图像去噪、边缘检测、特征提取等任务中。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 群论 (笔记)
  • uniapp常用标签
  • MATLAB 中的 reshape 函数
  • blender中获取虚拟相机渲染图片上每像素对应的纹理上的像素值
  • 3.美食推荐系统(Java项目springboot和vue)
  • linux 硬件 arm架构 汇编语言
  • 步进电机相关
  • erlang学习:用OTP构建系统23.12练习题
  • day-48 分割回文串
  • 1037 计算数列和
  • tcp如何保证可靠性传输
  • 保研考研机试攻略(满分篇):第一章——技巧之巅(2)
  • linux进程处理
  • Shader学习笔记
  • C#中的Array.Sort()和Reverse()
  • CSS 专业技巧
  • git 常用命令
  • github指令
  • Go 语言编译器的 //go: 详解
  • Java超时控制的实现
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • python 学习笔记 - Queue Pipes,进程间通讯
  • React Native移动开发实战-3-实现页面间的数据传递
  • Shadow DOM 内部构造及如何构建独立组件
  • 半理解系列--Promise的进化史
  • 从零搭建Koa2 Server
  • 搭建gitbook 和 访问权限认证
  • 翻译:Hystrix - How To Use
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 聊聊directory traversal attack
  • 让你的分享飞起来——极光推出社会化分享组件
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 我是如何设计 Upload 上传组件的
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 一个SAP顾问在美国的这些年
  • 追踪解析 FutureTask 源码
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 数据可视化之下发图实践
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​Python 3 新特性:类型注解
  • ​你们这样子,耽误我的工作进度怎么办?
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #includecmath
  • #pragma 指令
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (160)时序收敛--->(10)时序收敛十
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (floyd+补集) poj 3275
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (笔试题)分解质因式