当前位置: 首页 > news >正文

Opencv形态学——腐蚀、膨胀、开运算与闭运算、梯度运算、礼帽、黑帽

引言

形态学是基于图像形状的基础变换,一般情况下对二值图像上做处理。需要输入两个参数:一、输入原始图像;二、结构化元素或核,决定操作性质。

一、腐蚀(Erosion)

操作原理:当内核下的所有像素都为1时,原始图像中的像素(要么为1,要么为0)才会被认为是1,否则会被腐蚀为零。所以腐蚀之后的结果取决于内核的大小,迭代的次数不同结果也会不同。

import matplotlib.pyplot as plt
import cv2
import numpy as np
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
i=cv2.imread("C:/birdtemplet.bmp")
kernel=np.ones((5,5),np.uint8)
crosion=cv2.erode(i,kernel,iterations=2)
crosion1=cv2.erode(i,kernel,iterations=4)
i_1=np.hstack((i,crosion,crosion1))
cv_show('i_1',i_1)

iterations代表迭代的次数。结果如图所示:

二、 膨胀 Dilation

膨胀是腐蚀的逆运算。它增加了图像中的白色区域,或者说增加了前景目标对象的尺寸大小。通常情况下,在腐蚀操作后就是膨胀操作。因为,腐蚀消除了白色的·噪音,但也缩小了前景图,所以我们要扩大它。

kernel=np.ones((5,5),np.uint8)
crosion=cv2.erode(i,kernel,iterations=2)
kernel=np.ones((5,5),np.uint8)
dilate=cv2.dilate(i,kernel,iterations=2)
i_2=np.hstack((i,crosion,dilate))
cv_show('i_2',i_2)

结果显示为原图,腐蚀图,膨胀图:

三、开运算 

 先进行腐蚀,再进行膨胀叫做开运算。 通常情况下,含有噪声的图像二值化后,得到的边界是不平滑的,物体区域具有一些错判的孔洞,就要用到开运算。

opening=cv2.morphologyEx(i,cv2.MORPH_OPEN,kernel)
cv_show('opening',opening)

结果如图所示:

四、闭运算

先膨胀再腐蚀。

closing=cv2.morphologyEx(i,cv2.MORPH_CLOSE,kernel)
cv_show('closing',closing)

结果如图所示:

五、梯度运算(膨胀—腐蚀=梯度)

gradient=cv2.morphologyEx(i,cv2.MORPH_GRADIENT,kernel)
cv_show('gradient',gradient)

结果如图所示:

 六、礼帽(原始输入-开运算结果)

tophat=cv2.morphologyEx(i,cv2.MORPH_TOPHAT,kernel)
i_3=np.hstack((i,opening,tophat))
cv_show('i_3',i_3)

结果如图所示:

 七、黑帽(闭运算-原始输入)

blackhat=cv2.morphologyEx(i,cv2.MORPH_BLACKHAT,kernel)
i_4=np.hstack((i,closing,blackhat))
cv_show('i_4',i_4)

 结果如图所示:

相关文章:

  • [Django开源学习 1]django-vue-admin
  • JavaEE初阶:网络编程套接字
  • JAVA猎才学员成长心得分享
  • 2022年0903我的SpringBoot框架入门的第一个程序
  • 【高阶数据结构】并查集的实现(含压缩路径)及其应用-C++版本
  • Java——线程不安全的原因(图解)
  • [数据结构]~双向+循环链表从(0~1)
  • 【开学季】再见大一,你好大二 | 完成自己的未完成
  • java毕业设计网站SSM版学生选课系统[包运行成功]
  • 【计算机网络】第六章:应用层
  • FS03MR12A6MA1LBBPSA1 1200V 400A 紧凑型 六单元模块
  • 系统篇: ubuntu 18.04 ROS1 和 ROS2 环境搭建
  • 贪心算法 - 买卖股票的最佳时机|| + 分割平衡字符串
  • ActiveReports.NET 16.2RPX 部分报告的完全支持
  • 专业英语第八章Communications and Networks测试题
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【刷算法】求1+2+3+...+n
  • AHK 中 = 和 == 等比较运算符的用法
  • CSS中外联样式表代表的含义
  • JavaScript设计模式系列一:工厂模式
  • js 实现textarea输入字数提示
  • js继承的实现方法
  • PHP那些事儿
  • Python_OOP
  • redis学习笔记(三):列表、集合、有序集合
  • 订阅Forge Viewer所有的事件
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 复习Javascript专题(四):js中的深浅拷贝
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 离散点最小(凸)包围边界查找
  • 移动端唤起键盘时取消position:fixed定位
  • const的用法,特别是用在函数前面与后面的区别
  • 如何正确理解,内页权重高于首页?
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (离散数学)逻辑连接词
  • (十)T检验-第一部分
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)jQuery 基础
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .gitignore文件_Git:.gitignore
  • .htaccess 强制https 单独排除某个目录
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET 分布式技术比较
  • .net/c# memcached 获取所有缓存键(keys)
  • .so文件(linux系统)
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @ModelAttribute注解使用
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [AR Foundation] 人脸检测的流程
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [CLR via C#]11. 事件
  • [Go WebSocket] 多房间的聊天室(三)自动清理无人房间