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

OpenCV--形态学

形态学

  • 形态学
  • 图像全局二值化
  • 自适应阈值
  • 腐蚀操作
  • 膨胀
  • 开运算
  • 闭运算
  • 形态学梯度
  • 顶帽操作
  • 黑帽操作

形态学

从图像中提取对表达和描绘区域形状有意义的图像分量

图像全局二值化

import cv2
import numpy as np
"""
图像全局二值化--0与255
二值化的主要目的是通过简化图像信息、增强对比度、分割目标物体、提取特征信息、去除噪声以及压缩存储和快速处理等方式,使图像更容易被计算机处理和分析
最好是灰度图
"""
img = cv2.imread('./img/cat.jpeg')
# 二值操作对灰度图像操作,先把图像变为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化 127:阈值, 255最大值, cv2.THRESH_BINARY操作类型
# 返回两个值,一个是阈值,一个是二值化处理后的图片
thresh, dst = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)cv2.imshow('cat', np.hstack((gray, dst)))

自适应阈值

"""
自适应阈值二值化,全局二值化在全图中只能采用一个阈值,不同的部分具有不同的亮度,阈值应该不同
"""
# 255最大值, cv2.ADAPTIVE_THRESH_GAUSSIAN_C计算阈值的方法,有两个选择,这个是最好的, cv2.THRESH_BINARY操作类型
# 3为计算阈值的区域大小 0为一个常数,阈值等于平均值或者加权平均值减去这个常数
dst1 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 3, 0)

腐蚀操作

"""
腐蚀操作--通过消除图像中的边界点来使图像沿着边界向内收缩。这种操作可以用于消除图像中的小型噪点、细小物体,或者断开相连的物体。选择一个结构元素(也称为腐蚀核):结构元素是一个小的二维数组,用于定义腐蚀操作的运算方式。其大小和形状决定了腐蚀的强度和效果。
逐像素比较:将结构元素放置在图像的某个像素位置上,然后对于结构元素和图像重叠的区域,检查结构元素内的所有像素是否都与图像内的对应像素匹配。
更新像素值:如果结构元素内的所有像素都与图像内的对应像素匹配,则该像素保持不变;否则,将该像素置为背景值(通常是0或黑色)。
遍历整个图像:重复上述步骤,直到遍历完整个图像。简单点说就是,在全黑的背景图里面有一些白色字体,如果腐蚀核在背景图中的重叠区域全是白色,则结果为白色,但只要有一点黑色,则全为黑色
所以腐蚀核的大小很重要
"""
# 腐蚀核是全1的, iterations迭代次数,即腐蚀次数,次数越多,效果越好
kernel = np.opnes((3, 3), np.uint8)
dst2 = cv2.erode(img, kernel, iterations=2)# 但每次腐蚀核需要自己写,很麻烦,我们可以自动获取
# 获取形态学腐蚀核 cv2.MORPH_RECT:形状, MORPH_RECT长方形, MORPH_ELLIPSE椭圆, MORPH_CROSS十字架
# (5, 5)大小
kernel1 = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))

膨胀

"""
膨胀--通过将图像中的像素值进行扩展或“增肥”,使得图像的边界向外扩张
和腐蚀相反
"""
dst3 = cv2.dilate(img, kernel, iterations=1)

开运算

"""
开运算 = 腐蚀 + 膨胀
开运算可以去除图形外的噪点
真实使用时,注意调节核大小和迭代次数
"""
kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
dst4_1 = cv2.erode(img, kernel, iterations=1)
dst4_2 = cv2.dilate(img, kernel, iterations=1)# OpenCV提供了开运算(cv2.MORPH_OPEN)的api, 噪声比较多的情况下,kernel选择大一点
dst4_3 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, iterations=2)

闭运算

"""
闭运算 = 膨胀 + 腐蚀
闭运算可以去除图形内部的噪点
这里仅展示api方法,同上
真实使用时,注意调节核大小和迭代次数
"""
dst5 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, iterations=2)

形态学梯度

"""
形态学梯度 = 原图 - 腐蚀
即得到腐蚀掉的部分--边缘
真实使用时,注意调节核大小和迭代次数
"""
# cv2.MORPH_GRADIENT 形态学梯度
dst6 = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel, iterations=2)

顶帽操作

"""
顶帽操作 = 原图 - 开运算
开运算可以去除图形外的噪点,顶帽操作得到去除的噪点
真实使用时,注意调节核大小和迭代次数
"""
# cv2.MORPH_TOPHAT 顶帽操作
dst7 = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel, iterations=2)

黑帽操作

"""
黑帽操作 = 原图 - 闭运算
得到图形内部的噪点
真实使用时,注意调节核大小和迭代次数
"""
dst8 = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel, iterations=2)cv2.waitKey(0)
cv2.destroyAllWindows()

相关文章:

  • gitlab-cicd-k8s
  • C++ | Leetcode C++题解之第168题Excel表列名称
  • 华为云与AWS负载均衡服务深度对比:性能、成本与可用性
  • 嵌入式期末复习--补充(答案来自文心一言)
  • 基准电压端口,需要外接退耦电容为什么
  • C++入门二-重载和引用
  • MybatisPlus 调用 原生SQL
  • 百度一下首页制作(HTML+CSS)
  • Java安全
  • 使用docker离线制作es镜像,方便内网环境部署
  • RabbitMQ实践——交换器(Exchange)和绑定(Banding)
  • 数据结构:快速排序,归并排序,计数排序的实现分析
  • DSP28335:定时器
  • Linux中ls -lsa 和ls -lst区别
  • leetcode189 轮转数组
  • 230. Kth Smallest Element in a BST
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • canvas 五子棋游戏
  • JavaScript创建对象的四种方式
  • JS学习笔记——闭包
  • laravel 用artisan创建自己的模板
  • Lucene解析 - 基本概念
  • vue的全局变量和全局拦截请求器
  • 程序员该如何有效的找工作?
  • 工程优化暨babel升级小记
  • 区块链技术特点之去中心化特性
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 学习使用ExpressJS 4.0中的新Router
  • 用jQuery怎么做到前后端分离
  • ​油烟净化器电源安全,保障健康餐饮生活
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #Linux(帮助手册)
  • (09)Hive——CTE 公共表达式
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (libusb) usb口自动刷新
  • (LLM) 很笨
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (计算机网络)物理层
  • (九)信息融合方式简介
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (转)linux下的时间函数使用
  • (转)Sql Server 保留几位小数的两种做法
  • .gitattributes 文件
  • .net 中viewstate的原理和使用
  • .NET8使用VS2022打包Docker镜像
  • .NET命令行(CLI)常用命令
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?