(笔记七)利用opencv进行形态学操作

 (1)程序清单

形态学操作是一种图像处理技术,它基于数学形态学理论,用于改变图像的形状和结构。它主要通过结构元素的腐蚀和膨胀操作来实现。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: LIFEI
@time: 2023/8/31 21:57 
@file: test7.py
@project: pythonProject
@describe: CWNU
@# -------------------------------------------------(one)----------------------------------------------
@# -------------------------------------------------(two)----------------------------------------------
"""
# -------------------------------------------------(one)----------------------------------------------
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# ..........................
# 程序清单
# 1、侵蚀和膨胀所需函数
# 内核的大小决定着对图像的操作程度大小,内核会在图像中滑动,当内核中全为1时才会变为1,否则为0
# 迭代次数决定着对图像的操作次数
# cv.erode() # 参数分别为原始图像、内核、迭代次数
# cv.dilate() # 参数分别为原始图像、内核、迭代次数# 2、形态学梯度、开运算、闭运算、顶帽、黑帽所需函数
# cv.morphologyEx() # 参数分别为原始图像、cv.MORPH_ + 方法名 、内核
# 运算方法分别有:
# cv.MORPH_GRADIENT # 形态学梯度
# cv.MORPH_OPEN # 开运算
# cv.MORPH_CLOSE # 闭运算
# cv.MORPH_TOPHAT # 顶帽
# cv.MORPH_BLACKHAT # 黑帽# 3、内核的形状确立方法
# cv.getStructuringElement() # 参数分别为cv.MORPH_ + 形状名、内核的大小
# 形状方法有:
# cv.MORPH_RECT # 矩形内核
# cv.MORPH_ELLIPSE # 椭圆内核
# cv.MORPH_CROSS # 十字内核
# ..........................

 (2)算法实现

腐蚀操作通过将结构元素与图像进行逐像素的比较,将结构元素完全包含在图像中的区域保留下来,而其他区域则被腐蚀掉。这可以用于去除图像中的噪声、分离连接的物体以及缩小物体的大小。

膨胀操作与腐蚀操作相反,它通过将结构元素与图像进行逐像素的比较,将结构元素覆盖在图像上,从而扩大图像中的区域。这可以用于填充图像中的空洞、连接分离的物体以及增大物体的大小。

img = cv.imread(r"D:\data\test_img\test7.png")
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)# 内核
kernel = np.ones((5, 5), np.uint8)# 侵蚀操作
erosion = cv.erode(img, kernel, iterations=2)  # iterations表示核运动迭代的次数# 膨胀操作
dilation = cv.dilate(img, kernel, iterations=2)  # iterations表示核运动迭代的次数
plt.figure(1)
plt.subplot(131), plt.imshow(img), plt.title('ori img')
plt.subplot(132), plt.imshow(erosion), plt.title('erosion img')
plt.subplot(133), plt.imshow(dilation), plt.title('dilation img')
plt.show()

69d450e1c631471fb8a3d6582c2cd6ef.png 

形态学操作还包括其他一些操作,如开运算、闭运算、顶帽运算和底帽运算。

开运算是先进行腐蚀操作,再进行膨胀操作,可以用于去除图像中的细小物体。闭运算是先进行膨胀操作,再进行腐蚀操作,可以用于填充图像中的小孔。

# 重新建立内核核
kernel2 = np.ones((11, 11), np.uint8)
# 开操作
# 假设噪声位于后景, 即在对象外面
open_img = cv.imread(r"D:\data\test_img\test7-7-7.png")
open_img = cv.cvtColor(open_img, cv.COLOR_BGR2RGB)
opening = cv.morphologyEx(open_img, cv.MORPH_OPEN, kernel2)# 闭操作
# 假设噪声位于前景, 即在对象里面
close_img = cv.imread(r"D:\data\test_img\test7-7.png")
close_img = cv.cvtColor(close_img, cv.COLOR_BGR2RGB)
closing = cv.morphologyEx(close_img, cv.MORPH_CLOSE, kernel2)
plt.figure(2)
plt.subplot(221), plt.imshow(open_img), plt.title('ori open_img')
plt.subplot(222), plt.imshow(opening), plt.title('opening')
plt.subplot(223), plt.imshow(close_img), plt.title('ori close_img')
plt.subplot(224), plt.imshow(closing), plt.title('closing')
plt.show()

fa30bb3bcfe446a7a621ace3008be66d.png 

顶帽运算是原始图像与开运算之差,底帽运算是闭运算与原始图像之差,它们可以用于提取图像中的细节信息。

# 形态学梯度
# 侵蚀与膨胀之间的差异, 可以用于提取对象的边界
gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)# 顶帽运算
# 即原始图像与开运算的差异, 用于提取噪声
hot_hat = cv.morphologyEx(open_img, cv.MORPH_TOPHAT, kernel2)# 黑帽运算
# 即原始图像与闭运算的差异,用于提取噪声
black_hat = cv.morphologyEx(close_img, cv.MORPH_BLACKHAT, kernel2)plt.figure(3)
plt.subplot(131), plt.imshow(gradient), plt.title('gradient img')
plt.subplot(132), plt.imshow(hot_hat), plt.title('hot_hat img')
plt.subplot(133), plt.imshow(black_hat), plt.title('black_hat img')
plt.show()

c74ee7a1ae654df3a90bbe5a8c0f24e1.png

 

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

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

相关文章

Vue生成多文件pdf准考证

这是渲染的数据 这是生成的pdf文件,直接可以打印 需要安装和npm依赖和引入封装的pdf.js文件 npm install --save html2canvas // 页面转图片 npm install jspdf --save // 图片转pdfpdf.js文件 import html2canvas from "html2canvas"; import jsPDF …

SpringMVC框架@RequestMapping用法,处理器方法参数接收,处理器方法返回值详解

1. RequestMapping 定义请求规则 1.1 指定模块名称 通过RequestMapping 注解可以定义处理器对于请求的映射规则。该注解可以注解在方 法上,也可以注解在类上,但意义是不同的。value 属性值常以“/”开始。RequestMapping 的 value 属性用于定义所匹配请…

Python 爬虫—scrapy

scrapy用于从网站中提取所需数据的开源协作框架。以一种快速、简单但可扩展的方式。 该爬虫框架适合于那种静态页面, js 加载的话,如果你无法模拟它的 API 请求,可能就需要使用 selenium 这种使用无头浏览器的方式来完成你的需求了 入门 imp…

【实战-05】 flinksql look up join

摘要 look up join 能做什么? 不饶关子直接说答案, look up join 就是 广播。 重要是事情说三遍,广播。flinksql中的look up join 就类似于flinks flink Datastream api中的广播的概念,但是又不完全相同,对于初次访问…

C语言中关于printf()输出的时候的一个出栈入栈问题

先看一段代码,可以自己尝试一下,反正我当时尝试的时候好多搞不懂, 不过现在搞懂了,里面牵扯到了一个入栈和出栈的问题, 官方解释是这个: 因为C语言函数参数入栈顺序是从右到左的,所以计算顺序是…

20230904工作心得:集合应该如何优雅判空?

1 集合判空 List<String> newlist null;//空指针if( !newlist.isEmpty()){newlist.forEach(System.out::println);}//空指针if(newlist.size()>0 && newlist!null){newlist.forEach(System.out::println);}//可行if(newlist!null && newlist.size()&…

C语言 语法积累

参考博文&#xff1a; c语言中int默认是有符号还是无符号,C语言迷题&#xff1a;有符号数与无符号数的问题_旋斡勃人的博客-CSDN博客前些天偶然看到了一个收集C语言迷题的网站&#xff0c;很是感兴趣。本人对C/C语言本身很是感兴趣&#xff0c;曾经做过几年相应的开发&#xf…

van-cascader 异步加载

vant官网 异步加载选项 在使用级联选择时当一次性拿到数据量太大时不仅接口慢而且前端渲染页面也会变慢&#xff0c;用户体验很不好&#xff0c;建议使用异步加载选项&#xff0c; 拿到的接口让后端返回一个是否还有下一级的判断&#xff0c;不然van-cascader判断没有childre…

【Redis专题】Redis核心数据结构实战与高性能原理解析

目录 前言课程内容一、redis数据类型1.1 字符串&#xff08;string&#xff09;类型&#xff1a;比较简单的一种使用存储模型常用命令&#xff1a;&#xff08;截取自【菜鸟教程】&#xff09;部分演示应用场景 1.2 哈希&#xff08;hash&#xff09;类型&#xff1a;同类数据归…

EasyExcel 修改导出的文件属性

EasyExcel 修改导出的文件属性 导出的文件有多种属性,本文只针对sheet名称进行举例 需要自定义拦截器 ExcelWriter excelWriter EasyExcel.write(fileName).withTemplate(stream).registerWriteHandler(new TemplateSheetStrategyHandler()).build()registerWriteHandler (n…

使用rem + sass + 媒体查询 进行横竖屏适配移动端项目

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、 媒体查询&#xff08;Media Query&#xff09;1.简单了解2.简单例子3. 语法&#xff08;1&#xff09;媒体类型&#xff08;mediatype &#xff09;&#xff0…

快讯 | ALVA 荣获首届“格物杯”联通物联网应用创新大赛复赛一等奖!

8 月 7 日&#xff0c;“物聚龙江 智联百业”物联网创新发展合作交流暨首届“格物杯”联通物联网应用创新大赛企业赛道复赛 (赛区四)在哈尔滨举办。 ALVA Systems 凭借智能远程协助平台—— ALVA Rainbow 在近 50 家企业中脱颖而出&#xff0c;荣获首届“格物杯”联通物联网应…

静态路由配置实验:构建多路由器网络拓扑实现不同业务网段互通

文章目录 一、实验背景与目的二、实验拓扑三、实验需求四、实验解法1. 配置 IP 地址2. 按照需求配置静态路由&#xff0c;实现连接 PC 的业务网段互通 摘要&#xff1a; 本实验旨在通过配置网络设备的IP地址和静态路由&#xff0c;实现不同业务网段之间的互通。通过构建一组具有…

华为云 异构数据迁移

数据库和应用迁移 UGO&#xff08;Database and Application Migration UGO&#xff0c;以下简称为UGO&#xff09;是专注于异构数据库结构迁移的专业服务。可将源数据库中的DDL、DML和DCL一键自动转换为华为云GaussDB/RDS的SQL语法&#xff0c;通过数据库评估、对象迁移两大核…

如何实现MongoDB数据的快速迁移?

作为一种Schema Free文档数据库&#xff0c;MongoDB因其灵活的数据模型&#xff0c;支撑业务快速迭代研发&#xff0c;广受开发者欢迎并被广泛使用。在企业使用MongoDB承载应用的过程中&#xff0c;会因为业务上云/跨云/下云/跨机房迁移/跨地域迁移、或数据库版本升级、数据库整…

《TCP/IP网络编程》阅读笔记--基于TCP的服务器端/客户端

1--TCP/IP协议栈 TCP/IP协议栈共分 4 层&#xff0c;可以理解为数据收发分成了 4 个层次化过程&#xff1b; 链路层&#xff1a; 链路层是物理链接领域标准化的结果&#xff0c;专门定义LAN、WAN、MAN等网络标准&#xff1b; IP层&#xff1a; IP层用于解决数据传输过程中路径的…

小程序中如何查看会员的余额和变更记录

​通过查看会员的余额和变更记录&#xff0c;可以帮助商家更好地管理会员资金&#xff0c;提供更好的服务和用户体验。下面将介绍小程序中如何查看会员的余额以及余额的变更记录。 1. 找到指定的会员卡。在管理员后台->会员管理处&#xff0c;找到需要查看余额和记录的会员…

LoadImageTask

目录 1 LoadImageTask 1.1 // doInBackground完成后才会被调用 1.1.1 // 调用setTag保存图片以便于自动更新图片 1.2 // 从网上下载图片 1.2.1 // new URL对象 把网址传入 1.2.2 // 把下载好的图片保存到缓存中 LoadImageTaskpackage com.shrimp.xiaoweirob

【vue2第十二章】ref和$refs获取dom元素 和 vue异步更新与$nextTick使用

ref和$refs获取dom元素 为什么会有 ref 和 $refs&#xff1f; 因为在vue页面中使用dom查找元素&#xff0c;不管你是不是在子组件里面查找&#xff0c;查找的都是整个页面的元素&#xff0c;如果你想查找单独组件里面的元素是不容易实现的&#xff0c;除非把每个组件的class写…

Flink---1、概述、快速上手

1、Flink概述 1.1 Flink是什么 Flink的官网主页地址&#xff1a;https://flink.apache.org/ Flink的核心目标是“数据流上有状态的计算”(Stateful Computations over Data Streams)。 具体说明&#xff1a;Apache Flink是一个“框架和分布式处理引擎”&#xff0c;用于对无界…