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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/30615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何计算文档会消耗的Token数量?

在AI的世界里,"token"就像是把我们说的话或写的文字拆分成的小块块,每块可以是一个词、一个短语、一个标点,甚至一个字母。不同的AI系统可能有不同的拆分方法。 阿里云的灵积平台有个工具,叫做Token计算器。这个工具就…

经常混淆的ADC输入类型!

大家好,这里是大话硬件。 这篇文章我们来聊聊ADC的输入类型。 ADC的输入类型根据ADI的官网,分为了3种类型,单端,差分,伪差分。如下图快速选型的界面所示。 同时,TI的官网对ADC的输入类型划分也是同样的3种类型。 可见,两个器件厂家对ADC的输入类型都是这样定义的。 …

简说贪心算法

贪心算法(Greedy Algorithm)是一类在每一步选择中都做出当前最优解,以期望通过一系列局部最优选择达到全局最优解的算法。贪心算法的核心思想是通过一次次的局部优化来构建全局解。尽管这种方法不总是能找到全局最优解,但在许多情…

springMVC的bug

写SpringMVC时,配置视图解析器路径中少写了个“/”导致url拼接错误,无法返回视图

支持向量机 (SVM) 算法详解

支持向量机 (SVM) 算法详解 支持向量机(Support Vector Machine, SVM)是一种监督学习模型,广泛应用于分类和回归分析。SVM 特别适合高维数据,并且在处理复杂非线性数据时表现出色。本文将详细讲解 SVM 的原理、数学公式、应用场景…

三目运算符中间的表达式可以省略吗(a?:c)?

熟悉C语言的童靴对三目运算符都非常熟悉,a? b : c; 如果a为true,则整个运算符的值为b,否则为c;那么问题来了,三目运算符中间的表达式可以省略吗?即a? : c; 1、linux内核中出现的省略情况 本人在阅读内核代码是发现了下面的代码: preferr…

centos7 低版本docker 升级为高版本

删除 docker yum -y remove docker*安装 yum 管理工具 yum install -y yum-utils添加国内镜像 manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo查看可用软件版本yum list docker-ce --showduplicates|sort -r安装 yum -y install docke…

机器学习实验--- 金融数据基础与计算在线实验闯关

第1关:申万家用电器行业股票代码获取 任务描述 本关任务:根据右边测试平台的提示,补充代码。 # -*- coding: utf-8 -*- #1.读取“申万行业分类.xlsx”表,字段如下所示: # 行业名称 股票代码 股票名称 # 获得“…

项目中选择Entity Framework Core还是Dapper?

我是将 Dapper 还是 Entity framework core 用于下一个 .NET 项目?当你必须做出这个决定时,总是令人困惑,为了项目的成功,你需要做出正确的决定。让我来帮你... 介绍 使用 .NET 开发的应用程序可以根据其使用的对象关系映射器 &…

「前端+鸿蒙」鸿蒙应用开发-在线教育测验案例

在鸿蒙应用开发中,状态管理是确保应用能够响应用户交互并保持数据一致性的关键。以下是一个状态管理的真实案例,包括功能简介、布局和样式、状态定义、业务逻辑、UI交互等。 案例 - 在线教育测验应用 功能简介 用户可以进行选择题测验。应用提供自动评分和统计信息。用户可以…

Java | Leetcode Java题解之第168题Excel表列名称

题目: 题解: class Solution {public String convertToTitle(int columnNumber) {StringBuffer sb new StringBuffer();while (columnNumber ! 0) {columnNumber--;sb.append((char)(columnNumber % 26 A));columnNumber / 26;}return sb.reverse().t…

【APP移动端性能测试】第一节.APP应用架构、环境和敏捷开发模型介绍

文章目录 前言一、APP应用架构二、APP项目环境 2.1 后端项目环境 2.2 前端项目环境三、Scrum敏捷开发模型 3.1 Scrum敏捷模型基础介绍 3.2 Scrum敏捷开发开发流程总结 前言 一、APP应用架构 (1)APP应用架构 (2&#xff0…

springboot应用cpu飙升的原因排除

1、通过top或者jps命令查到是那个java进程, top可以看全局那个进程耗cpu,而jps则默认是java最耗cpu的,比如找到进程是196 1.1 top (推荐)或者jps命令均可 2、根据第一步获取的进程号,查询进程里那个线程最占用cpu,发…

js 用正则表达式 匹配自定义字符之间的字符串数据,如:( )、[ ]、{ }、< >、【】等括号之间的字符串数据

要使用正则表达式匹配尖括号()之间的数据,可以使用以下代码示例: 在JavaScript中,你可以使用正则表达式来匹配括号()之间的数据。以下是一个简单的例子,它展示了如何使用正则表达式来获取两对括号之间的文本。 // 示例字符串 con…

LENOVO联想 小新 16 IAH8 2023款(83BG)笔记本原厂Windows11系统,恢复出厂开箱状态预装OEM系统镜像安装包下载

适用型号:小新 16 IAH8【83BG】 链接:https://pan.baidu.com/s/18VbGbBXtQEW5P8wLIyJtAQ?pwddv1s 提取码:dv1s 联想原装Win11系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想电脑管家…

董宇辉的人生关键词:年轻人的成长指南

在当今这个信息爆炸、竞争激烈的社会中,年轻人面临着前所未有的挑战与机遇。如何从纷繁复杂的世界中找到属于自己的道路?近日,知名人生导师董宇辉为年轻人提出了几个人生关键词,这些词汇不仅凝聚了他多年的人生感悟,更…

服务器负载均衡

什么是服务器负载 1. 常见理解的平均负载 每次发现系统变慢时,我们通常做的第一件事,就是执行 top 或者 uptime 命令,来了解系统的负载情况。比如下列情况 [rootkube-node1 ~]# uptime09:44:37 up 74 days, 11:53, 1 user, load average:…

【STM32-ST-Link】

STM32-ST-Link ■ ST-Link简介■ ST-Link驱动的安装。■ ST-Link编程软件(MDK)配置。■ ST-Link固件升级方法 ■ ST-Link简介 由于德产 J-LINK 价格非常昂贵, 而国产 J-LINK 因为版权问题将在万能的淘宝销声匿迹。 所以我们有必要给大家介绍 JTAG/SWD 调试工具中另…

架构设计 - Nginx Lua 缓存配置

摘要: web 应用业务缓存通常3级: 一级缓存:JVM 本地缓存 二级缓存:Redis集中式缓存 三级缓存:Nginx Proxy Cache 缓存 或 Nginx Lua 缓存 四级缓存:静态资源CDN缓存 本文主要分享 Nginx Lua 缓存配置开发 鉴于 Nginx Proxy Cache 缓存的劣势,在生产项目中很少使用…

如何做好技术管理与技术规划?

一、背景 做好技术管理不仅要求紧跟行业前沿动态,同时也需把握好产品开发的阶段性分期,确保技术成果转化和产品落地的顺畅进行。技术管理的成功与否,在很大程度上取决于能否精准捕捉市场需求,据此调整任务优先级。面对瞬息万变的…