常用的形态学操作:腐蚀、膨胀、开运算和闭运算

一、什么叫形态学操作

形态学操作就是改变物体的形状,比如腐蚀就是"变瘦",膨胀就是"变胖"

形态学操作一般作用于二值化图,来连接相邻的元素或分离成独立的元素。腐蚀和膨胀是针对图片中的白色部分!

白色的像素为255,黑色的像素值为0

二、腐蚀与膨胀

1. 腐蚀

腐蚀的效果是把图片"变瘦",其原理是在原图的小区域内取局部最小值。因为是二值化图,只有0和255,所以小区域内有一个0该像素点就为0:

这样原图中边缘的地方就会变成0(黑色),达到了瘦身的效果。

OpenCV中用 cv2.erode() 函数进行腐蚀,只需要指定核的大小就行:

import cv2
import numpy as np
img = cv2.imread('j.bmp', 0)
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel) # 腐蚀

这个核也叫结构元素,因为形态学操作其实也是应用卷积来实现的。结构元素可以是矩形、椭圆、十字形,可以用 cv2.getStructuringElement() 来生成不同形状的结构元素,比如:

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))  # 矩形结构
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) # 椭圆结构
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5)) # 十字形结构

博主替换过核,效果差距不大。

2. 膨胀

膨胀与腐蚀相反,取的是局部最大值,效果是把图片变胖:

dilation = cv2.dilate(img, kernel)  # 膨胀
img = cv2.imread('j.bmp')

kernel = np.ones((5, 5), np.uint8)    # 矩形结构

erosion = cv2.erode(img, kernel)   # 腐蚀
dilation = cv2.dilate(img, kernel) # 膨胀 titles = ['Original', 'erosion', 'dilation']
images = [img, erosion, dilation] # 使用Matplotlib显示
# 一行三列图
for i in range(3):
plt.subplot(1, 3, i + 1)
plt.imshow(images[i])
plt.title(titles[i], fontsize=8)
plt.xticks([]), plt.yticks([])
plt.show()

三、开、闭运算

先腐蚀后膨胀叫开运算(因为先腐蚀会分开物体),其作用是:分离物体,消除小区域。使用 cv.morphologyEx() 函数实现:

# 开运算--先腐蚀后膨胀
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) img1 = cv2.imread('j_noise_out.bmp')
opening = cv2.morphologyEx(img1, cv2.MORPH_OPEN, kernel)

闭运算则相反:先膨胀后腐蚀(先膨胀会使白色的部分扩张,以至于消除"闭合"物体里面的小黑洞,所以叫闭运算)

# 闭运算--先膨胀后腐蚀
img2 = cv2.imread('j_noise_in.bmp')
closing = cv2.morphologyEx(img2, cv2.MORPH_CLOSE, kernel)

开、闭运算确实很容易混淆。如果我们的目标物体外面有很多无关的小区域,就用开运算去除掉;如果物体内部有很多小黑洞,就用闭运算填充掉

四、形态学梯度、顶帽、黑帽

形态学梯度:膨胀图减去腐蚀图,dilation - erosion,这样会得到物体的轮廓:

img = cv2.imread('school.bmp', 0)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

    

顶帽:原图减去开运算后的图:src - opening

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

黑帽:闭运算后的图减去原图:closing - src

五、小结

1. 形态学就是改变物体的形状,腐蚀是物体"变瘦"、膨胀使物体"变胖"

2. 先腐蚀后膨胀会分离物体,所以叫开运算,常用来去除小区域物体

3. 先膨胀后腐蚀会消除物体内的小洞,所以叫闭运算。

参考地址:http://ex2tron.wang/opencv-python-erode-and-dilate/

OpenCV-Python:形态学操作的更多相关文章

  1. opencv python实用操作

    画多边形 fillConvexPloy与fillConvexPloy的区别 fillConvexPloy 用来画单个凸多边形: 如果点集的连线不是凹多边形,则会找一个最小的凸多边形把该凹多边形包住画出 ...

  2. opencv:形态学操作-开闭操作

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  3. opencv:形态学操作-腐蚀与膨胀

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  4. 【图像处理】OpenCV+Python图像处理入门教程(七)图像形态学操作

    图像形态学主要从图像内提取分量信息,该分量信息通常对表达图像的特征具有重要意义.例如,在车牌号码识别中,能够使用形态学计算其重要特征信息,在进行识别时,只需对这些特征信息运算即可.图像形态学在目标视觉 ...

  5. OPENCV形态学操作1

    形态学操作是指基于形状的一系列图像处理操作,包括膨胀,腐蚀,二值化,开运算,闭运算,顶帽算法,黑帽算法,形态学梯度等,最基本的形态学操作就是膨胀和腐蚀. 一.膨胀 首先需要明确一个概念,膨胀和腐蚀都是 ...

  6. OpenCV学习笔记(六) 滤波器 形态学操作(腐蚀、膨胀等)

    转自:OpenCV 教程 另附:计算机视觉:算法与应用(2012),Learning OpenCV(2009) 平滑图像:滤波器 平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法.平滑处理的 ...

  7. OpenCV 图象腐蚀形态学操作 全家桶

    图象腐蚀与形态学操作 opencv 1. 通过调用库函数实现图像的腐蚀.膨胀: 2. 通过设置结构元素.元素大小.形态学操作类型实现对图象的形态学操作. 源码(VS2017+OpenCV 4.0) # ...

  8. python opencv入门-形态学转换

    目标: 学习不同的形态操作 例如 腐蚀.膨胀.开运算.闭运算 等. 我们要学习的函数有 cv2.erode(),cv2.dilate(),cv2.morphologyEx() 等. 原理 :一般对二值 ...

  9. opencv学习笔记(五)----图像的形态学操作

    图像的形态学操作有基本的腐蚀和膨胀操作和其余扩展形态学变换操作(高级操作)-----开运算,闭运算,礼帽(顶帽)操作,黑帽操作...(主要也是为了去噪声,改善图像) 形态学操作都是用于处理二值图像(其 ...

  10. opencv::形态学操作

    形态学操作 开操作- open 闭操作- close 形态学梯度- Morphological Gradient 顶帽 – top hat 黑帽 – black hat 开操作- open 先腐蚀后膨 ...

随机推荐

  1. Java 异常体系

    1.异常简介 Java把异常作为一种类,当做对象来处理.所有异常类的基类是Throwable类,两大子类分别是Error和Exception. 系统错误由Java虚拟机抛出,用Error类表示.Err ...

  2. Delphi Create(nil), Create(self), Create(Application)的区别

    最近的项目中经常在程序中动态创建控件,势必用到Create. 但是随之而来的问题就是动态创建的控件是否可以正确的释放内存? 以及 Create(nil), Create(self), Create(A ...

  3. koa-router 后台路由管理框架

    koa-router是koa框架配套的路由管理模块,对后台的接口分离出来. 首先引入koa和koa-router, 然后分批设置路由: 代码中的institution.modifyInsStatus是 ...

  4. Java连接远程Mysql过程中遇到的各种问题

    2018-11-16 10:46 2018-11-19 21:35 前言 本篇文章记录的是本人在使用Java程序连接另一台电脑(同一局域网)上的Mysql数据库的过程中遇到的各种问题及解决方案.希望能 ...

  5. [LOJ3083][GXOI/GZOI2019]与或和——单调栈

    题目链接: [GXOI/GZOI2019]与或和 既然求的是二进制运算的和,那么我们按位考虑,这样就将矩阵变成了一个$01$矩阵. 对于或运算,就是求有多少个子矩形中有$1$. 直接求不好办,考虑有多 ...

  6. 自用windows小软件

    好用的软件的定义:没有广告,提升效率,最低的内存占用,体积小 1.解压工具 bandizip:自动解压功能,棒呆了 网址:https://www.bandisoft.com/ 2.pdf阅读编辑工具 ...

  7. 使用@property

    @property装饰器就是负责把一个方法变成属性调用的,既能检查参数,又可以用类似属性这样简单的方式来访问类的变量 class Student(object): @property def scor ...

  8. python学习日记(OOP——反射)

    反射 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函数,并执行.利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! hasattr ...

  9. 交互题[CF1103B Game with modulo、CF1019B The hat、CF896B Ithea Plays With Chtholly]

    交互题就是程序与电脑代码的交互. 比如没有主函数的程序,而spj则给你一段主函,就变成了一个整体函数. 还有一种就是程序和spj之间有互动,这个用到fflush(stdout);这个函数就可以实现交互 ...

  10. Mock8 moco框架如何返回一个cookie信息

    还是用之前的startupWithCookies.json这个文件,直接往里面添加上面的一个代码: [ { "description":"这是一个会返回cookies信息 ...