OpenCV(图像处理)-基于Python-形态学处理-开运算、闭运算、顶帽、黑帽运算

在这里插入图片描述

  • 1. 形态学
  • 2. 常用接口
    • 2.1 cvtColor()
    • 2.2 图像二值化
      • threshod()
      • 自适应阈值二值化
        • adaptiveThreshod()
    • 2.3 腐蚀与膨胀
      • erode()
      • getStructuringElement()
      • dilate()
    • 2.4开、闭、梯度、顶帽、黑帽运算
      • morphologyEx()

1. 形态学

OpenCV形态学是一种基于OpenCV库的数字图像处理技术,主要用于处理图像的形状、结构和空间关系。它包括一系列图像处理工具和算法,包括膨胀、腐蚀、开运算、闭运算、形态学梯度、顶帽、黑帽等。

通过对图像进行形态学操作可以实现一些重要的图像处理任务,比如去除噪声、分离图像中的对象、填充图像中的空洞、改变图像的形状、寻找图像中的轮廓等等。在OpenCV中,形态学操作通常采用二值图像进行处理,它可以通过C++或Python编程实现具体的形态学算法

2. 常用接口

在对图片进行相关操作之前,我们首先要先将彩色图片转变为灰度图像,方便图像的二值化。

2.1 cvtColor()

转换颜色通道的API
dst = cv2.cvtColor( img , cv2.COLOR_BGR2GRAY)
第二个参数为BGR图像转到灰度图像。

2.2 图像二值化

threshod()

该API能将灰度图像按照设定的阈值,将图像二值化。

ret ,dst = cv2.threshod( img, thresh, maxVal, type)
img:图像,最好是灰度图。
thresh:阈值(低于阈值为0,高于阈值的部分为maxVal)
maxVal:超过阈值的替换成maxVal
返回值有两个,第一个是使用的阈值,第二个是输出后的图像

type:

  • CV2.THRESH_BINARY
  • CV2.THRESH_BINARY_INV
  • CV2.THRESH_TRUNC
  • CV2.THRESH_TOZERO
  • CV2.THRESH_TOZERO_INV

在这里插入图片描述
上图显示了不同参数下,二值化的不同图像,第一个图为原始图像,后面的为不同的规则。


下列示例将一个灰度图分别以阈值100,180进行二值化。

import cv2
import numpy as np

img = cv2.imread('./image/lena_small.png')
# 将图片转换为灰度图
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 将阈值设为100,180
ret, img2 = cv2.threshold(img1, 100, 255, cv2.THRESH_BINARY)
ret1, img3 = cv2.threshold(img1, 180, 255, cv2.THRESH_BINARY)

cv2.imshow('orgin_img', img1)
cv2.imshow('img_100', img2)
cv2.imshow('img_180', img3)

cv2.waitKey(0)


在这里插入图片描述

自适应阈值二值化

有时候由于光照不均匀以及阴影的存在,有可能导致阴影部分的白色会被二值化为黑色,因此只有一个阈值的缺陷就暴露了出来。
在这里插入图片描述
用全局二值化,将阈值设置为180时,由于阴影的存在,会将阴影部分黑化,导致显示不完全。因次提出了自适应二值化的方法。

adaptiveThreshod()

dst = cv2.adaptiveThreshod(img, maxVal, adaptiveMethod, Type, blockSize, C)
img:需要二值化的图像(最好是灰度图
maxVal:超过阈值的像素设置成maxVal
adaptiveMethod:见下图
Type:为全局二值化的Type
blockSize:临近区域的大小,填奇数
C:常量,从计算的平均值或加权平均值中减去,一般为0

在这里插入图片描述

2.3 腐蚀与膨胀

腐蚀就是将一个图片关键部分“缩小“,膨胀将一个图形的关键部分放大。卷积核通常为全1的奇数矩阵。

在这里插入图片描述

在这里插入图片描述

erode()

原始图像中的一个像素无论是1还是0,只有当内核中的所用像素都是1时,结果才是1,否则结果就是0
dst = cv2.erode(img, kenel, iterations = 1)
img:要腐蚀的图像
kenel:卷积核,全1的矩阵
iterations:执行次数,默认为1次

在这里插入图片描述

getStructuringElement()

便捷API,帮助我们获得指定大小的卷积核
kernel = cv2.getStructuringElement(type, Size)
Type:MORPH_RECT(矩形);MORPH_ELLIPSE(椭圆形部分为1);MORPH_CROSS(十字架部分为1)
Size:(3, 3);(5, 5)…

import cv2
import numpy as np

img = cv2.imread('./image/j.png')

# 自己创建5*5的卷积核
# kernel = np.ones((5, 5), np.uint8)
# 获得卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
dst = cv2.erode(img, kernel)

cv2.imshow('orgin_img', img)
cv2.imshow('dst', dst)

cv2.waitKey(0)

在这里插入图片描述

dilate()

只要锚点非0,那么结果非0,卷积核越大,膨胀越大
dst = cv2.dilate(img, kernel, iterations = 1)
img:要膨胀的图像
kenel:卷积核,全1的矩阵
iterations:执行次数,默认为1次

import cv2
import numpy as np

img = cv2.imread('./image/j.png')

# 自己创建5*5的卷积核
# kernel = np.ones((5, 5), np.uint8)
# 获得卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
# # 腐蚀
# dst = cv2.erode(img, kernel)

# 膨胀
dst = cv2.dilate(img, kernel)

cv2.imshow('orgin_img', img)
cv2.imshow('dst', dst)

cv2.waitKey(0)

在这里插入图片描述

2.4开、闭、梯度、顶帽、黑帽运算

开运算:腐蚀+膨胀
闭运算:膨胀+腐蚀
梯度:原图-腐蚀
顶帽:原图-开运算
黑帽:原图-闭运算

morphologyEx()

dst = cv2.morphologyEx(img, Type, kernel)
img:进行操作的原图
kernel:噪点大,用大核

Type:

  • MORPH_OPEN/MORPH_CLOSE(开闭运算)
  • MORPH_GRADIENT(梯度运算)
  • MORPH_TOPHAT/MORPH_BLACKHAT(顶黑帽)

开运算:去除文字外的小噪点
在这里插入图片描述

闭运算:去除文字内的小噪点
在这里插入图片描述

梯度运算:获得文字的轮廓
在这里插入图片描述
顶帽:得到大图像外的小图形
在这里插入图片描述

黑帽:得到大图形内的小图形
在这里插入图片描述
以上就是形态学相关API的使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何安装MySQL数据库

目录 什么是MySQL数据库 第一步 安装依赖环境 第二步 创建MySQL相关进程用户 第三步 导入MySQL相关包 第四步 解包到指定目录下 第五步 切换到MySQL目录下编译安装 第六步 编译 第七步 更改指定文件的所有者和所属组 第八步 进入指定配置文件清空内容 第九步 配置指定…

IDEA Build Artifacts 功能使用总结

文章目录 创建Artifact步骤Build Artifact步骤 打开IDEA,在没有创建Artifact时,菜单"Build -> Build Artifacts…“是灰色的,不可用状态。 所以,第一步是进入"File -> Project Structure…”,创建Arti…

12-代码实战——服务器版表白墙

目录 1.版本一:将数据存到内存中 ①约定前后端交互接口 a.添加表白信息: b.查询表白列表: ②在webapp包下创建message-wall.html前端文件 ③在java包下创建AddMessageServlet后端类 ④在java包下创建MessageListServlet后端类 2.版本…

【Azure】微软 Azure 基础解析(七)Azure 网络服务中的虚拟网络 VNet、网关、负载均衡器 Load Balancer

本系列博文还在更新中,收录在专栏:「Azure探秘:构建云计算世界」 专栏中。 本系列文章列表如下: 【Azure】微软 Azure 基础解析(三)描述云计算运营中的 CapEx 与 OpEx,如何区分 CapEx 与 OpEx…

通过 Python 封装关键词搜索阿里巴巴商品api接口

以下是使用 Python 封装关键词搜索阿里巴巴商品列表数据的步骤: 使用 requests 库向阿里巴巴搜索接口发送 HTTP 请求,可以使用 GET 或 POST 方法,请求参数中应包含搜索关键词、每页展示数量、当前页码等信息。 解析返回的 response 中的 HTM…

【Java高级语法】(六)内部类Inner Class:这可能是史上最全的关于内部类的学习资料~

Java高级语法详解之包装类 :one: 概念:two: 优缺点:three: 使用2.1 成员内部类2.2 局部内部类2.3 匿名内部类2.4 静态内部类2.5 小结:外部类访问四种内部类的特点2.6 小结:其他类访问四种内部类的特点 :four: 内部类与外部类的关系:five: 应用场景:six: …

01-抒写代码之诗:Golang 关键字的文学探索

📃个人主页:个人主页 🔥系列专栏:Golang基础 💬Go(又称Golang)是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性,拥有高效的并发编程能力和简洁的语法。G…

Jenkins结合gitee自动化部署SpringBoot项目

安装 安装教程 插件选择 Gitee Plugin 配置 源码管理 填写源码地址 注意:请确保genkins所在的服务器有权限git拉取远程仓库代码,如果不可以请参考ssh配置centos 配置ssh拉取远程git代码 源码管理 构建触发器 1.勾选Gitee webhook 触发构建 2.生成we…

论文笔记:MEASURING DISENTANGLEMENT: A REVIEW OF METRICS

0 摘要 学习解缠和表示数据中的变化因素是人工智能中的一个重要问题。虽然已经取得了许多关于学习这些表示的进展,但如何量化解缠仍然不清楚。 虽然存在一些度量标准,但对它们的隐含假设、真正衡量的内容以及限制了解甚少。因此,当比较不同的…

一键开启GPT 平行时空模式

不知道大家日常使用GPT的时候,在一次会话中是如何完成同类任务的对话的? 简单点来说,假设你已经完成了角色设定,比如你设定GPT是一名文案编辑,那么接下来你会多次给它提交稿件让它进行编辑,那么在多次提交的时候&…

抽象工厂模式

一.定义 抽象工厂模式(Abstract Factory Pattern)是一种比较常用的模式,其定义如下: Provide an interface for creating families of related or dependent objects without specifyingtheir concrete classes.(为创建一组相关或相互依赖的对象提供一个接口&#…

算法刷题-双指针-二分法

27. 移除元素 力扣题目链接 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。你不需…

Web前端开发技术储久良第三版课后答案

P16-第1章 练习与实验答案 练习1 1.选择题 (1)B (2)B (3)B (4)D (5)A 2.填空题 (1)标记、文本 (2)Tim Berners-Lee(蒂姆伯纳斯李) (3)查看 (4)NotePad、EditPlus、TextPad、TopStyle、UltraEdit等 (5)超文本标记语言、统一资源定位符(器&am…

Axios和Spring MVC[前端和后端的请求和响应处理]

在前后端交互中,Axios和Spring MVC扮演着不同的角色,分别负责前端和后端的请求和响应处理。它们之间的作用如下: Axios(前端): 发送HTTP请求:前端使用Axios库发送HTTP请求到后端。可以使用Axi…

webpack生产模式配置

一、生产模式和开发模式介绍 生成模式(production mode)是指在开发完成后将代码部署到生产环境中运行的模式,通常需要进行代码压缩、优化、合并,以减少文件大小和请求次数,提高页面加载速度和运行效率。 开发模式&am…

02_LinuxLED驱动开发

目录 Linux下LED灯驱动原理 地址映射 ioremap函数 iounmap函数 I/O内存访问函数 LED灯驱动程序编写 编写测试APP 编译驱动程序 编译测试APP 运行测试 Linux下LED灯驱动原理 Linux下的任何外设驱动,最终都是要配置相应的硬件寄存器。所以LED灯驱动最终也是对I.MX6ULL…

LVS-DR群集部署

目录 一、LVS-DR数据包流向分析 二、 DR 模式的特点 总结 三、LVS-DR中的ARP问题 1.在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱 2.路由器根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效 3.解…

React 对比class与Effect Hook优化响应式数据更新监听,感受useEffect真正的强大

还是之前写过的一个组件 import React from "react"export default class index extends React.Component{constructor(props){super(props);this.state {name: "小猫猫"}}componentDidMount ()>{document.title this.state.name;}componentDidUpda…

吴恩达ChatGPT课爆火

点上方计算机视觉联盟获取更多干货 没想到时至今日,ChatGPT竟还会犯低级错误? 吴恩达大神最新开课就指出来了: ChatGPT不会反转单词! 比如让它反转下lollipop这个词,输出是pilollol,完全混乱。 哦豁&#…

【调制BFSK】二进制频移键控FSK的数字调制(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…