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.mfbz.cn/a/172890.html

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

相关文章

Spring-IOC-@Import的用法

1、Car.java package com.atguigu.ioc; import lombok.Data; Data public class Car {private String cname; }2、 MySpringConfiguration2.java package com.atguigu.ioc; import org.springframework.context.annotation.Bean; import org.springframework.context.annotatio…

一、防火墙-基础知识

学习防火墙之前,对路由交换应要有一定的认识 1、什么是防火墙2、防火墙的发展史3、安全区域3.1.接口、网络和安全区域的关系3.2.报文在安全区域之间流动方向3.3.安全区域的配置安全区域小实验 3.4.状态检测和会话机制3.4.1.状态检测3.4.2.会话 3.5.状态检测和会话机…

c语言-数据结构-链式二叉树

目录 1、二叉树的概念及结构 2、二叉树的遍历概念 2.1 二叉树的前序遍历 2.2 二叉树的中序遍历 2.3 二叉树的后序遍历 2.4 二叉树的层序遍历 3、创建一颗二叉树 4、递归方法实现二叉树前、中、后遍历 4.1 实现前序遍历 4.2 实现中序遍历 4.3 实现后序遍历 5、…

《算法通关村——最长公共前缀问题解析》

《算法通关村——最长公共前缀问题解析》 14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入:strs ["flower","flow","flight…

腾讯云代金券怎么领取(腾讯云代金券在哪领取)

腾讯云代金券是可抵扣费用的优惠券,领券之后新购、续费、升级腾讯云相关云产品可以直接抵扣订单金额,节省购买腾讯云的费用,本文将详细介绍腾讯云代金券的领取方法和使用教程。 一、腾讯云代金券领取 1、新用户代金券【点此领取】 2、老用户…

Unity中Shader的PBR的基础知识与理论

文章目录 前言一、什么是PBR二、什么是PBS在这里插入图片描述 三、PBS的核心理论1、物质的光学特性(Substance Optical Properties)2、微平面理论(Microfacet Theory)3、能量守恒(Energy Conservation)4、菲…

90%的测试工程师是这样使用Postman做接口测试的...

一:接口测试前准备 接口测试是基于协议的功能黑盒测试,在进行接口测试之前,我们要了解接口的信息,然后才知道怎么来测试一个接口,如何完整的校验接口的响应值。 那么问题来了,那接口信息从哪里获取呢&…

金山云2023年Q3财报:持续向好!

11月21日,金山云公布了2023年第三季度业绩。 财报显示,金山云Q3营收16.3亿元,调整后毛利率达12.1%再创历史新高,调整后毛利额同比上涨57.5%。今年第三季度,公有云实现收入10.2亿元,毛利率达到4.7%&#xf…

STM32出现 Invalid Rom Table 芯片锁死解决方案

出现该现象的原因为板子外部晶振为25M,而程序软件上以8M为输入晶振频率,导致芯片超频锁死,无法连接、下载。 解决方案 断电,将芯片原来通过10k电阻接地的BOOT0引脚直接接3.3V,硬件上置1上电,连接目标板&am…

Redis跳跃表

前言 跳跃表(skiplist)是一种有序数据结构,它通过在每一个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。 跳跃表支持平均O(logN),最坏O(N),复杂度的节点查找,还可以通过顺序性来批量处理节点…

ROS2中Executors对比和优化

目录 SingleThreadExecutorEventExecutor SingleThreadExecutor 执行流程 EventExecutor 通信图

局域网文件共享神器:Landrop

文章目录 前言解决方案Landrop软件界面手机打开效果 软件操作 前言 平常为了方便传文件,我们都是使用微信或者QQ等聊天软件,互传文件。这样传输有两个问题: 必须登录微信或者QQ聊天软件。手机传电脑还有网页版微信,电脑传手机比…

MT8735/MTK8735安卓核心板规格参数介绍

MT8735核心板是一款高性能的64位Cortex-A53四核处理器,设计用于在4G智能设备上运行安卓操作系统。这款多功能核心板支持LTE-FDD/LTE-TDD/WCDMA/TD-SCDMA/EVDO/CDMA/GSM等多种网络标准,同时还具备WiFi 802.11a/b/g/n和BT4.0LE等无线通信功能。此外&#x…

pipeline传参给job

场景:pipeline实现自动部署,job实现自动测试,但是只有部署dddd环境时,才调自动测试的job,所以需要在调自动测试job时,把参数传给测试job 上一个任务会显示下一步调谁 ------------------------------------…

Redis从入门到精通(三)-高阶篇

文章目录 0. 前言[【高阶篇】3.1 Redis协议(RESP )详解](https://blog.csdn.net/wangshuai6707/article/details/132742584)[【高阶篇】3.3 Redis之底层数据结构简单动态字符串(SDS)详解](https://blog.csdn.net/wangshuai6707/article/details/131101404)[【高阶篇】3.4 Redis…

玩转系统|长亭雷池WAF详细使用教程——深入了解

目录 配置防护站点 界面操作​ 如何配置域名、端口、上游服务器​ 工作原理​ 在单独设备上部署雷池(推荐)​ 直接在网站服务器上部署雷池​ 和其他反代设备一起部署的情况​ 配置后网站无法访问,如何排查​ 测试防护效果 确认网站…

5-4计算一串字符的空格数字字符其他

#include<stdio.h> int main(){char c;int space0;//空格int letters0;//英文字母int numbers0;//数字int others0;//其他字符printf("请输入一行字符&#xff1a;");while((cgetchar())!\n)//获取字符的内容&#xff0c;到\n停止{if(c>a&&c<z|…

BGP笔记

自治系统----AS AS划分的原因&#xff1a;如果网络太大&#xff0c;路由数量进一步增加&#xff0c;路由表规模变得太大&#xff0c;会导致路由收敛速度变慢&#xff0c;设备性能消耗加大&#xff0c;且全网设备对于路由信息的认知不同&#xff0c;造成流量通讯障碍 AS号&…

智能时代的智能工具(gpt)国产化助手

目前gpt对代码以及其他领域都是可以支持&#xff0c;在国内有很多&#xff0c;常用的百度的 文心一言 &#xff0c;阿里的 通义千问 &#xff0c;还有&#xff08;“豆包”&#xff0c;“”讯飞星火“”&#xff09;等&#xff0c;除了写代码可以外&#xff0c;也可以很好的支持…

java.lang.UnsupportedOperationException 关于Arrays.asList问题解决

解析String 字符串为List集合ArrayList<String> itemsList Arrays.asList(items.split("\\|")List<String> itemsList Arrays.asList(items.split("\\|")final Iterator<String> iterator itemsList.iterator();while (iterator.hasNex…