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

一、什么叫形态学操作

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

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

白色的像素为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. const 本质

    const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动.对于简单类型的数据(数值.字符串.布尔值),值就保存在变量指向的那个内存地址,因此等同于常量.但对于复合类型的数据( ...

  2. react-navigation 简介

    StackNavigator: 原理和浏览器相似但又有局限,浏览器的方式是开放性的,通过点击一个链接可以跳转到任何页面(push),点击浏览器后退按钮,返回到前一个页面(pop).StackNavig ...

  3. [Linux] Vim 撤销 回退 操作

    在vi中按u可以撤销一次操作 u   撤销上一步的操作      Ctrl+r 恢复上一步被撤销的操作 注意:        如果你输入“u”两次,你的文本恢复原样,那应该是你的Vim被配置在Vi兼容 ...

  4. codeforces483B

    Friends and Presents CodeForces - 483B You have two friends. You want to present each of them severa ...

  5. poj3436(拆点最大流)

    题意:给你p和n,p代表每台计算器需要几个部分组成,n代表有几个组装机器,接下来n行,每行第一个数代表这台机器能够每小时组装几台,剩下前三个数字表示使用这台机器需要的前置条件(0代表当前组装不能有这个 ...

  6. axios页面无刷新提交from表单

    页面部分大概意思一下 <form method="post" enctype="multipart/form-data"> ... </for ...

  7. python之内置函数(一)

    一.内置函数一1.内置函数总览 abs() dict() help() min() setattr()all() dir() hex() next() slice() any() divmod() i ...

  8. 解决Docker安装MySQL不区分大小写问题

    Docker安装MySQL忽略大小写问题的问题连接MySQL: 查看当前mysql的大小写敏感配置 show global variables like '%lower_case%'; +------ ...

  9. webpack学习记录-认识loader(二)

    Loader 就像是一个翻译员,能把源文件经过转化后输出新的结果,并且一个文件还可以链式的经过多个翻译员翻译. loader参考文章:https://webpack.docschina.org/loa ...

  10. mysql日志分析工具之mysqlsla

    背景介绍: 很多情况下,都需要对MySQL日志进行各种分析,来了解系统运行的方方面面.MySQL官方自带了一些工具对日志进行分析,比如mysqlbinlog可以用来分析二进制日志,mysqlslow可 ...