二十 形态学操作

介绍

形态学操作其实就是改变物体的形状,比如腐蚀就是”变瘦”,膨胀就是”变胖”,看下图就明白了

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

主要是应用在二值图像分析中,灰度图像亦可。

可以看做膨胀是将白色区域扩大,腐蚀是将黑色区域扩大

一、膨胀与腐蚀

相关函数

def getStructuringElement(shape, ksize, anchor=None): # real signature unknown; restored from __doc__

第一个参数shape:表示内核的形状,有三种形状可以选择

矩形:MORPH_RECT; 交叉形:MORPH_CORSS; 椭圆形:MORPH_ELLIPSE;

第二个参数ksize:是内核的尺寸(n,n)

第三个参数anchor:锚点的位置

getStructuringElement函数会返回指定形状和尺寸的结构元素。

1、腐蚀erode

腐蚀的效果是把图片”变瘦”,其原理是在原图的小区域内取局部最小值。因为是二值化图,只有0和255,所以小区域内有一个是0该像素点就为0,这样原图中边缘地方就会变成0,达到了瘦身目的。

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

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))  # 十字形结构

代码实现

 1 import cv2 as cv
 2 import numpy as np
 3
 4 def erode_image(image):
 5     print(image.shape)
 6     gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
 7     ret , binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU) #大律法获取二值图像
 8     cv.imshow(‘binary‘,binary)
 9     kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))  #可以修改卷积核大小来增加腐蚀效果,越大腐蚀越强
10     dst = cv.erode(binary,kernel)
11     cv.imshow(‘erode_demo‘,dst)
12
13 img = cv.imread(‘1.jpg‘)
14 cv.imshow(‘input image‘,img)
15 erode_image(img)
16 cv.waitKeyEx(0)
17 cv.destroyAllWindows()

2、膨胀dilate

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

dilation = cv2.dilate(img, kernel)  # 膨胀

代码实现

 1 import cv2 as cv
 2 import numpy as np
 3
 4 #膨胀就是白色部分变多
 5 def dilate_image(image):
 6     print(image.shape)
 7     gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
 8     ret , binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU) #大律法获取二值图像
 9     cv.imshow(‘binary‘,binary)
10     kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))  #可以修改卷积核大小来增加腐蚀效果,越大膨胀越强
11     dst = cv.dilate(binary,kernel)
12     cv.imshow(‘dilate_demo‘,dst)
13
14 img = cv.imread(‘1.jpg‘)
15 cv.imshow(‘input image‘,img)
16 dilate_image(img)
17 cv.waitKeyEx(0)
18 cv.destroyAllWindows()

3、可以不进行灰度处理,对彩色图片进行处理

(1)膨胀

kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
dst = cv.dilate(src,kernel)
cv.imshow("result",dst)

(2)腐蚀

kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
dst = cv.erode(src,kernel)
cv.imshow("result",dst)

二、开闭运算

1、开

先腐蚀后膨胀叫开运算(因为先腐蚀会分开物体,这样容易记住),其作用是:分离物体,消除小区域。

特点:消除噪点,去除小的干扰块,而不影响原来的图像

这类形态学操作用cv2.morphologyEx()函数实现:

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))  # 定义结构元素
img = cv2.imread(‘j_noise_out.bmp‘, 0)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)  # 开运算

代码实现

 1 import cv2 as cv
 2 import numpy as np
 3
 4 def camp(val1,val2):
 5     pv = val1 + val2
 6     if pv > 255:
 7         return 255
 8     elif pv < 0:
 9         return 0
10     else:
11         return pv
12
13 def open_demo(image):
14     gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)     #(h,w) = (576,1024)
15     print(gray.shape)
16     for i in range(1000):
17         h = np.random.random_integers(0,gray.shape[0]-1)    #因为返回的是闭区间内的随机整数,h是从0开始的,所以要减1
18         w = np.random.random_integers(0,gray.shape[1]-1)
19         value = np.random.random_integers(0,255)        #随机添加的像素值
20         gray[h,w] = camp(gray[h,w],value)
21     ret , binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
22     cv.imshow(‘binary‘,binary)
23     kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))
24     open = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)     #开操作,先腐蚀后膨胀,会消除一些为1的白色噪点
25     cv.imshow(‘open_demo‘,binary)
26
27 img = cv.imread(‘1.jpg‘)
28 cv.imshow(‘input image‘,img)
29 open_demo(img)
30 cv.waitKey(0)
31 cv.destroyAllWindows()

2、闭

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

img = cv2.imread(‘j_noise_in.bmp‘, 0)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)  # 闭运算

代码实现

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

原文地址:https://www.cnblogs.com/pacino12134/p/9890492.html

时间: 2024-10-02 01:44:38

二十 形态学操作的相关文章

python运维开发(二十)----models操作、中间件、缓存、信号、分页

内容目录 select Form标签数据库操作 models操作F/Q models多对多表操作 Django中间件 缓存 信号 分页 select Form标签补充 在上一节中我们可以知道Form标签有两个作用,一个做用户提交数据验证,一个是生成HTML标签 在生成HTML标签中可以生成select标签,select的选项数据我们可以在数据库中查询读取到. class UserType(models.Model): caption = models.CharField(max_length=1

Powershell管理系列(二十六)PowerShell操作之批量导出&导入邮箱

-----提供AD\Exchange\Lync\Sharepoint\CRM\SC\O365等微软产品实施及外包,QQ:185426445.电话18666943750 项目中有时候做跨林邮箱迁移的时候,条件不成熟,比如安全考虑或者其他考虑,不能做双林信任,这样就提出了一个问题,历史邮件需要使用的话怎么办,一个简单高效的解决办法就是从源森林批量导出邮件为.pst文件,在批量导入到目的域森林,具体操作如下: 1.赋予管理账号邮件导入导出权限,命令如下: cls whoami New-Manageme

攻城狮在路上(叁)Linux(二十六)--- linux文件系统的特殊查看与操作

一.boot sector 与 super block的关系: 1.boot sector用于存放引导装载程序,占用1024个字节. 2.super block的大小也为1024字节. 3.若block大小为1k,则boot sector和super block各占一个block. 4.若block大于1K(2K/4K)时,则两者都位于第一个block中. 二.磁盘空间的浪费问题:暂不考虑. 三.利用GUN的parted命令进行分区行为: 因为fdisk不支持高于2TB的分区. 命令格式: pa

第一百二十六节,JavaScript,XPath操作xml节点

第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准DOM去查找XML中的节点方式,大大降低了查找难度,方便开发者使用.但是,DOM3级以前的标准并没有就XPath做出规范:直到DOM3在首次推荐到标准规范行列.大部分浏览器实现了这个标准,IE则以自己的方式实现了XPath. 一.IE中的XPath 在IE8及之前的浏览器,XPath是采用内置基于A

QT开发(二十四)——QT文件操作

QT开发(二十四)--QT文件操作 一.QT文件操作简介 QT中的IO操作通过统一的接口简化了文件与外部设备的操作方式,QT中文件被当作一种特殊的外部设备,文件操作与外部设备操作相同. 1.IO操作的主要函数接口 打开设备:bool open(OpenMode mode) 读取数据:QByteArray read(qint64 maxSize) 写入数据:qint64 write(const QByteArray & byteArray) 关闭设备:void close() IO操作的本质是连续

C语言第十二讲,文件操作.

C语言第十二讲,文件操作. 一丶文件操作概述 在操作系统中,我们的文档都称为文件.操作系统也为我们提供了接口进行操作.不同语言都是使用的相同的接口,只不过封装的上层接口不一样 操作文件的步骤 打开文件->读写文件->关闭文件. 二丶文件流的概述. 文件流称为 输入流和输出流.  其实就是从内存写数据到磁盘.和从磁盘读数据到内存. 内存->磁盘  称为输出流. 输出到磁盘 磁盘->内存 称为输入流.读取到内存. 三丶文件的打开和关闭. 1.操作原型. FILE *fopen(char

OPENCV形态学操作1

形态学操作是指基于形状的一系列图像处理操作,包括膨胀,腐蚀,二值化,开运算,闭运算,顶帽算法,黑帽算法,形态学梯度等,最基本的形态学操作就是膨胀和腐蚀. 一.膨胀 首先需要明确一个概念,膨胀和腐蚀都是针对于图像中较亮的区域而言的,膨胀就是亮的区域变多了,而腐蚀就是暗的区域变多了. 膨胀的功能主要有消除噪声,分割出独立的图像元素,在图像操作的时候,有时候需要对图像中的某些形状进行检测,而这些形状相互连接在一起,不好分开检测,膨胀就能切开这些形状(很小的连接位置),或者图像中有很小块的黑斑,或许是相

EasyPR--开发详解(4)形态学操作、尺寸验证、旋转等操作

在上一篇深度分析与调优讨论中,我们介绍了高斯模糊,灰度化和Sobel算子.在本文中,会分析剩余的定位步骤. 根据前文的内容,车牌定位的功能还剩下如下的步骤,见下图中未涂灰的部分. 图1 车牌定位步骤 我们首先从Soble算子分析出来的边缘来看.通过下图可见,Sobel算子有很强的区分性,车牌中的字符被清晰的描绘出来,那么如何根据这些信息定位出车牌的位置呢? 图2 Sobel后效果 我们的车牌定位功能做了个假设,即车牌是包含字符图块的一个最小的外接矩形.在大部分车牌处理中,这个假设都能工作的很好.

QT开发(二十)——QT对话框

QT开发(二十)--QT对话框 一.对话框简介 对话框是与用户进行简短交互的顶层窗口 QDialog是QT中所有对话框窗口的基类,QDialog继承于QWidget,是一种容器型的组件,是定制了窗口样式的特殊QWidget. QDialog作为一种专用的交互窗口,不能作为子部件嵌入其他容器中. 二.对话框类型 对话框类型分为模态对话框和非模态对话框. 1.模态对话框 模态对话框显示后无法与父窗口进行交互,是一种阻塞式的对话框,使用QDialog::exec()函数调用. 模态对话框一般在栈上创建