opencv-形态学处理

通过阈值化分割可以得到二值图,但往往会出现图像中物体形态不完整,变的残缺,可以通过形态学处理,使其变得丰满,或者去除掉多余的像素。常用的形态学处理算法包括:腐蚀,膨胀,开运算,闭运算,形态学梯度,顶帽运算和底帽运算。
1. 腐蚀
腐蚀操作类似于中值平滑,也有一个核,但不进行卷积运算,而是取核中像素值的最小值代替锚点位置的像素值,这样就会使图像中较暗的区域面积增大,较亮的的区域面积减小。如果是一张黑底,白色前景的二值图,就会使白色的前景物体颜色变小,就像被腐蚀了一样。

#coding:utf-8
import cv2 as cv
img = cv.imread(r"C:\Users\mzd\Desktop\opencv\images.jpg")
img_cvt = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,img_thr = cv.threshold(img_cvt,200,255,cv.THRESH_BINARY_INV)
#cv2.threshold() 是 OpenCV 中用于图像阈值处理的函数。阈值处理是一种将图像转换为二值图像的方法,通过将像素值与一个预先定义的阈值进行比较,将像素分为两个类别:大于阈值的为一类,小于等于阈值的为另一类。
kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,5))
#cv2.getStructuringElement() 是 OpenCV 中用于创建结构元素的函数,常用于形态学操作(如腐蚀和膨胀)。结构元素是一个小的形状,它在图像上滑动,用于改变图像的形状。
dst = cv.erode(img_thr,kernel,iterations=1)
cv.imshow("img",img)
cv.imshow("img_thr",img_thr)
cv.imshow("dst",dst)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述cv2.erode() 是 OpenCV 中用于进行腐蚀操作的函数。腐蚀是形态学操作的一种,它通过在图像中滑动结构元素(kernel)来减小图像中的白色区域(前景对象)。它常常被用于去除图像中的小白色噪声或者分离两个连接在一起的物体。 (白色的目标变小,相反黑色的目标变大),腐蚀操作将减小图像中的白色区域,可以用于去除小的白色噪声或者分离连接在一起的物体。

基本语法如下:

erosion = cv2.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

参数说明:

  • src: 输入图像,单通道二进制图像(黑白图像)。
  • kernel: 结构元素,可以使用 cv2.getStructuringElement() 创建。
  • dst(可选): 输出图像。
  • anchor(可选): 结构元素的锚点,默认为 (-1, -1) 表示结构元素的中心。
  • iterations(可选): 腐蚀的迭代次数,默认为1。
  • borderType(可选): 边界处理的方式,通常为默认值 cv2.BORDER_CONSTANT
  • borderValue(可选): 边界的填充值,默认为0。

2.膨胀
膨胀操作和腐蚀操作正好相反,是取核中像素值的最大值代替锚点位置的像素值,这样会使图像中较亮的区域增大,较暗的区域减小。如果是一张黑底,白色前景的二值图,就会使白色的前景物体颜色面积变大,就像膨胀了一样。

#coding:utf-8
import cv2 as cv
img = cv.imread(r"C:\Users\mzd\Desktop\opencv\images.jpg")
img_cvt = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,img_thr = cv.threshold(img_cvt,200,255,cv.THRESH_BINARY_INV)
#cv2.threshold() 是 OpenCV 中用于图像阈值处理的函数。阈值处理是一种将图像转换为二值图像的方法,通过将像素值与一个预先定义的阈值进行比较,将像素分为两个类别:大于阈值的为一类,小于等于阈值的为另一类。
kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,5))
#cv2.getStructuringElement() 是 OpenCV 中用于创建结构元素的函数,常用于形态学操作(如腐蚀和膨胀)。结构元素是一个小的形状,它在图像上滑动,用于改变图像的形状。
dst = cv.dilate(img_thr,kernel,iterations=1)cv.imshow("img",img)
cv.imshow("img_thr",img_thr)
cv.imshow("dst",dst)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述
cv2.dilate() 是 OpenCV 中用于进行膨胀操作的函数。膨胀是形态学操作的一种,它通过在图像中滑动结构元素(kernel)来增加图像中的白色区域(前景对象)。膨胀操作将增加图像中的白色区域膨胀常常被用于连接图像中的白色区域或者扩展物体的大小。

基本语法如下:

dilation = cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

参数说明:

  • src: 输入图像,单通道二进制图像(黑白图像)。
  • kernel: 结构元素,可以使用 cv2.getStructuringElement() 创建。
  • dst(可选): 输出图像。
  • anchor(可选): 结构元素的锚点,默认为 (-1, -1) 表示结构元素的中心。
  • iterations(可选): 膨胀的迭代次数,默认为1。
  • borderType(可选): 边界处理的方式,通常为默认值 cv2.BORDER_CONSTANT
  • borderValue(可选): 边界的填充值,默认为0。

3.开运算,闭运算,顶帽,顶帽

  1. 开运算:先进行腐蚀操作,后进行膨胀操作,主要用来去除一些较亮的部分,即先腐蚀掉不要的部分,再进行膨胀。
  2. 闭运算:先进行膨胀操作,后进行腐蚀操作,主要用来去除一些较暗的部分。
  3. 形态学梯度:膨胀运算结果减去腐蚀运算结果,可以拿到轮廓信息。
  4. 顶帽运算:原图像减去开运算结果。
  5. 底帽运算:原图像减去闭运算结果。
 #coding:utf-8
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(r"C:\Users\mzd\Desktop\opencv\images.jpg")
img_cvt = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#cv2.cvtColor() 是 OpenCV 中用于进行颜色空间转换的函数。颜色空间转换是图像处理中常见的操作,用于将图像从一种颜色表示转换为另一种。常见的颜色空间包括灰度空间、RGB空间、HSV空间等。
ret,img_thr = cv.threshold(img_cvt,200,255,cv.THRESH_BINARY_INV)
#cv2.threshold() 是 OpenCV 中用于图像阈值处理的函数。阈值处理是一种将图像转换为二值图像的方法,通过将像素值与一个预先定义的阈值进行比较,将像素分为两个类别:大于阈值的为一类,小于等于阈值的为另一类。
kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,5))
#cv2.getStructuringElement() 是 OpenCV 中用于创建结构元素的函数,常用于形态学操作(如腐蚀和膨胀)。结构元素是一个小的形状,它在图像上滑动,用于改变图像的形状。
open = cv.morphologyEx(img_thr,cv.MORPH_OPEN,kernel,iterations=1)
#cv2.morphologyEx()是OpenCV 中进行形态学操作的函数,它可以实现一些基本的形态学操作,如膨胀、腐蚀、开运算、闭运算等。形态学操作主要用于图像处理中的形状分析和图像变换。cv2.MORPH_OPEN: 开运算(先腐蚀后膨胀。
close = cv.morphologyEx(img_thr,cv.MORPH_CLOSE,kernel,iterations=1)
#cv2.morphologyEx()是OpenCV 中进行形态学操作的函数,它可以实现一些基本的形态学操作,如膨胀、腐蚀、开运算、闭运算等。形态学操作主要用于图像处理中的形状分析和图像变换。cv2.MORPH_CLOSE: 闭运算(先膨胀后腐蚀)
gradient = cv.morphologyEx(img_thr,cv.MORPH_GRADIENT,kernel,iterations=1)
#cv2.MORPH_GRADIENT: 梯度运算(膨胀图减去腐蚀图)。
tophat = cv.morphologyEx(img_thr,cv.MORPH_TOPHAT,kernel,iterations=1)
#cv2.MORPH_TOPHAT: 顶帽运算(原始图像减去开运算图像)。
blackhat = cv.morphologyEx(img_thr,cv.MORPH_BLACKHAT,kernel,iterations=1)
#cv2.MORPH_BLACKHAT: 黑帽运算(闭运算图像减去原始图像)。
images=[img_thr,open,close,gradient,tophat,blackhat]
titles=["img_thr","open","close","gradient","tophat","blackhat"]
for i in range(6):plt.subplot(2,3,i+1),plt.imshow(images[i],"gray")plt.title(titles[i])plt.xticks([]),    plt.yticks([])
plt.show()

在这里插入图片描述
cv2.morphologyEx() 是 OpenCV 中进行形态学操作的函数,它可以实现一些基本的形态学操作,如膨胀、腐蚀、开运算、闭运算等。形态学操作主要用于图像处理中的形状分析和图像变换。

基本语法如下:

dst = cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

参数说明:

  • src: 输入图像。
  • op: 形态学操作的类型,可以是以下之一:
    • cv2.MORPH_OPEN: 开运算(先腐蚀后膨胀)。
    • cv2.MORPH_CLOSE: 闭运算(先膨胀后腐蚀)。
    • cv2.MORPH_GRADIENT: 梯度运算(膨胀图减去腐蚀图)。
    • cv2.MORPH_TOPHAT: 顶帽运算(原始图像减去开运算图像)。
    • cv2.MORPH_BLACKHAT: 黑帽运算(闭运算图像减去原始图像)。
  • kernel: 结构元素,可以使用 cv2.getStructuringElement() 创建。
  • dst(可选): 输出图像。
  • anchor(可选): 结构元素的锚点,默认为 (-1, -1) 表示结构元素的中心。
  • iterations(可选): 迭代次数,默认为1。
  • borderType(可选): 边界处理的方式,通常为默认值 cv2.BORDER_CONSTANT
  • borderValue(可选): 边界的填充值,默认为0。

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

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

相关文章

CDN加速在目前网络安全里的重要性

在当今数字化时代,网络已经成为我们生活不可或缺的一部分。然而,随之而来的是网络安全的威胁不断增加,为了应对这一挑战,CDN(内容分发网络)的应用变得愈发重要。本文将从一个旁观者的角度分析当前的网络安全…

【设计模式】结构型设计模式

结构型设计模式 文章目录 结构型设计模式一、概述二、适配器模式(Adapter Pattern)2.1 类适配器模式2.2 对象适配器模式2.3 接口适配器模式2.4 小结 三、桥接模式(Bridge Pattern)四、装饰器模式(Decorator Pattern&am…

基于ubuntu20.04安装ros系统搭配使用工业相机

基于ubuntu20.04安装ros系统搭配使用工业相机 1. ROS系统安装部署1.1更新镜像源1.1.1 备份源文件1.1.2 更新阿里源1.1.3 更新软件源 1.2 ros系统安装1.2.1 添加ros软件源1.2.2 添加秘钥1.2.3 更新软件源1.2.4 配置及更换最佳软件源1.2.5 ROS安装1.2.6 初始化rosdep1.2.7 设置环…

datagrip只导出表结构

话不多说,直接上教程。 datagrip版本:2022.3 第一步,连接数据库 第二步,右击数据库,复制即可

【游记】NOIP2023

Day -8 本来以为初中生不能参加NOIP。 老师突然通知,说初中生参加NOIP的分数线定在140分,我可以进NOIP,我开心了 😃 于是我又开始备(juan)战(ti)了。 Day -8、-7、-6、-5 晚上9:00-10:00卷题。 卷了一些往年NOIP的水题。。。 Da…

【20年扬大真题】编写对数组求逆的递归算法

【20年扬大真题】 编写对数组求逆的递归算法 void swap(int* a, int* b) {int tmp *b;*b *a;*a tmp; } void Ni(int arr[],int left,int right) {if (left > right) {return;}swap(&arr[left], &arr[right]);Ni(arr, left 1, right - 1); } int main() {int ar…

将数字每千分位用逗号隔开

// 无小数版本 let format n > {let num n.toString() let len num.lengthif (len < 3) {return num} else {return format(num.slice(0,len-3)),num.slice(len-3)} } let resformat(1232327666663) // 1,232,323 console.log(res)// 有小数版本 let format n > …

C#有关里氏替换原则的经典问题答疑

目录 理解创建类型与变量类型很关键 先来理解变量类型。 再来理解创建类型。 有了正确的理解再来看疑问 里氏替换原则是面向对象七大原则中最重要的原则。 语法表现&#xff1a;父类容器装子类对象。 namespace 里氏替换原则 {class GameObject { } class Player : GameO…

[Vue3] vue-router路由守卫进阶

路由守卫&#xff0c;可以想象为古代御前侍卫&#xff0c;路由守卫&#xff0c;则是对路由进行权限控制 分类&#xff1a;全局守卫、独享守卫、组件内守卫 文章目录 1.全局前置-路由守卫2.全局后置守卫3.独享守卫4.组件内路由守卫5.keep-alive遇见vue-router6.路由器的两种工作…

详解Python安装requests库的实例代码

文章目录 前言基本用法基本的get请求带参数的GET请求解析json关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前…

类加载器与反射

1&#xff1a;Java类加载机制 简介&#xff1a; 虚拟机把数据从Class文件加载到内存&#xff0c;并对数据进行校验&#xff0c;解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的java类型。 2&#xff1a;JVM加载Class文件的原理机制 Java中的所有类&#xff0c;都需…

“茶叶创新:爆改营销策略,三个月狂销2300万“

我的朋友去年制作了一款白茶&#xff0c;并在短短三个月内将其销售量推到了2300万的高峰。你相信吗&#xff1f; 这位朋友并没有任何茶叶方面的经验&#xff0c;他只是一个有着冒险精神的企业家。他先找到了一家代工厂&#xff0c;帮助他把他的茶叶理念转化为现实。 当他把茶叶…

win11,安装python,pip,和opencv

1,安装python 在应用商店&#xff0c;输入python&#xff0c;下载安装 2&#xff0c;安装pip 在cmd中&#xff0c;输入pip install SomePackage&#xff0c;安装某一个版本的pip 3,安装opencv 在cmd中&#xff0c;输入 pip3 install opencv-contrib-python -i https://pyp…

【Python】153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。

问题描述 153是一个非常特殊的数&#xff0c;它等于它的每位数字的立方和&#xff0c;即1531*1*15*5*53*3*3。编程求所有满足这种条件的三位十进制数。 输出格式 按从小到大的顺序输出满足条件的三位十进制数&#xff0c;每个数占一行。 方法一&#xff1a; for i in range(10…

私域运营如何提高收益?

一旦建立了私域之后&#xff0c;企业需要不断地进行数据统计与分析&#xff0c;以寻找提高收益的方法。通过收集和分析用户的信息&#xff0c;了解他们的购物行为、心理需求等&#xff0c;从而制定更符合顾客口味的促销计划和产品服务。只有持续对数据进行监控&#xff0c;才能…

代码随想录 10.13 || 二叉树 LeetCode 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

二叉树的定义&#xff1a; 回顾一下二叉树的定义&#xff0c;加固记忆。 struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptre) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, Tre…

crontab配置定时根据名称杀进程

服务器上某个进程杀掉后会重启&#xff0c;怀疑是被当成肉鸡&#xff0c;因此是用linux自带的crontab定时执行脚本杀掉进程 上传脚本文件到服务器 #! /bin/bash # 要杀掉进程的名称 APPLICATION"ntools"if pkill -f "${APPLICATION}"; thenecho "${…

深度学习之基于Pytorch的昆虫分类识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介系统架构技术亮点 二、功能三、系统四. 总结 一项目简介 # 深度学习基于 Pytorch 的昆虫分类识别系统介绍 深度学习在图像分类领域取得了显著的成就&#…

ArcGIS Pro 优化的热点分析【Optimized Hot Spot Analysis】

ArcGIS Pro 优化的热点分析【Optimized Hot Spot Analysis】Optimized Hot Spot Analysis 优化的热点分析https://mp.weixin.qq.com/s/lfoIls8exW5G6PPJ9gtDew em&#xff0c;先给大家推荐一个空间统计分析的学习资源网站 https://spatialstats-analysis-1.hub.arcgis.com/ .…