OpenCV-Python实现腐蚀与膨胀的实例

什么是形态学

要了解腐蚀之前,我们需要了解一个概念:形态学。

形态学,又名数学形态学(Mathematical Morphology),是图像处理过程中一个非常重要的研究方向。形态学主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要的意义,通常是图像理解时所使用的最本质的形状特征。

例如,在识别手写数字时,能够通过形态学运算得到其骨架信息,在具体的识别时,仅针对其骨架进行运算即可。形态学处理在视觉检测,文字识别,医学图像处理,图像压缩编码等领域都有非常重要的应用。

形态学操作主要包含:腐蚀,膨胀,开运算,闭运算,形态学梯度运算,顶帽运算,黑帽运算等操作。腐蚀操作与膨胀操作是形态学的运算基础,将腐蚀与膨胀结合,就可以实现开运算,闭运算,形态学梯度等不同形式的运算。

所以本篇博文将重点讲解腐蚀与膨胀。

腐蚀

腐蚀是最基本的形态学操作之一,它能够将图像的边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去除。腐蚀主要用来“收缩”或者“细化”二值图像中的前景,借此实现去噪声,元素分割等功能。

在腐蚀的过程中,通常使用一个结构元来逐个像素地扫描要被腐蚀的图像,并根据结构元和被腐蚀的图像的关系来确定腐蚀结果。

首先,我们来看一张腐蚀处理图:

(1)表示要被腐蚀的图像

(2)结构元

(3)橙色数字是结构元在遍历图像时,结构元完全位于前景对象内部时的3个全部可能的位置;此时,结构元分别位于img[2,1],img[2,2],img[2,3]处。

(4)腐蚀结果result,即在结构元完全位于前景图像中时,将其中心点所对应的result中的像素点的值置为1;当结构元不完全位于前景图像中时,将其中心点对应的result中的像素点置为0。(按位与)

在OpenCV中,使用函数cv2.erode()实现腐蚀操作,其完整定义如下:

def erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None):

src:原始图像

kernel:结构元,可以自定义,也可以通过函数cv2.getStructuringElement()生成

iterations:腐蚀操作迭代的次数,默认为1,即只进行一次操作

至于其他参数以及取值,前面博文都有介绍,这里不在赘述。

下面,我们使用该函数来测试一下腐蚀的操作:

import cv2
import numpy as np

img = cv2.imread("8.jpg",cv2.IMREAD_UNCHANGED)
kernel = np.ones((9,9), np.float32)
result = cv2.erode(img,kernel)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后,我们得到的效果对比图如下:

可以看到,腐蚀操作将原始图像内的毛刺给腐蚀掉了,如果想腐蚀的更严重,可以设置iterations参数的值。

膨胀

膨胀与腐蚀正好相反,膨胀能对图像的边界进行扩张。膨胀操作将与当前的对象(前景)接触到的背景点合并到当前对象内,从而实现将图像边界点向外扩张。如果图像内的两个对象距离较近,可能在膨胀后连接到一起。

膨胀操作对填补图像分割后图像内所存在的空白相当有帮助。同样的,膨胀也需要一个结构元进行操作。下面,我们还是用矩阵来讲解膨胀的原理。

(1)待膨胀的原图

(2)结构元

(3)橙色部分是结构元遍历原图时,结构元中心像素点位于[1,1],img[3,3]时,与前景色存在重合像素点的两种情况,实际上共有9个这样的与前景对象重合的可能位置。结构元中心分别位于img[1,1],img[1,2],img[1,3],img[2,1],img[2,2],img[2,3],img[3,1],img[3,2],img[3,3]。

(4)膨胀后的结果图像result,在结构元内,当任意一个像素点与前景对象重合时,其中心点所对应的膨胀结果图像内的像素点的值为1;当结构元与前景对象完全无重合时,其中心点对应的膨胀结果图像内像素点的值为0。(按位或)

在OpenCV中,它给我们提供cv2.dilate()实现对图像的膨胀操作。其完整定义如下:

def dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None):

src:原始图像

kernel:结构元

其他参数与前文一致,不在赘述。下面,我们使用该函数测试膨胀的效果,具体代码如下所示:

import cv2
import numpy as np

img = cv2.imread("8.jpg",cv2.IMREAD_UNCHANGED)
kernel = np.ones((9,9), np.float32)
result = cv2.dilate(img,kernel)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后,效果如下所示:

可以看到,图像的头像膨胀之后与身体连接到了一起,同时旁边的线条也被加粗。如果想膨胀的更严重,可以修改iterations参数的值。

到此这篇关于OpenCV-Python实现腐蚀与膨胀的实例的文章就介绍到这了,更多相关OpenCV 腐蚀与膨胀内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • opencv 图像腐蚀和图像膨胀的实现

    语言:python+opencv 为什么使用图像腐蚀和图像膨胀 如图,使用图像腐蚀进行去噪,但是为压缩噪声. 对腐蚀过的图像,进行膨胀处理,可以去除噪声,并保持原样形状. 图像腐蚀 腐蚀主要针对的是二值图像,如只有0和1两个值, 两个输入对象:1原始二值图像,2卷积核 使用卷积核遍历原始二值图像,如果卷积核对应的元素值均为1,其值才为1,否则为0.如图,红色为卷积核. 腐蚀后的结果示意图见下面,效果是将边缘抹掉一部分. 使用方法:erode 中文翻译:侵蚀 处理结果=cv2.erode(原始图像

  • OpenCV+python实现膨胀和腐蚀的示例

    1,概念及原理: 膨胀(Dilating) (或) (1)将图像 A 与任意形状的内核 (B),通常为正方形或圆形,进行卷积. (2)内核 B 有一个可定义的 锚点, 通常定义为内核中心点. (3)进行膨胀操作时,将内核 B 划过图像A,将内核 B 覆盖区域的最大相素值提取,并代替锚点位置的相素.显然,这一最大化操作将会导致图像中的亮区开始"扩展" (因此有了术语膨胀 dilation ). 以3*3的内核为例: 腐蚀(Eroding) (与) (1)腐蚀在形态学操作家族里是膨胀操作的

  • OpenCV-Python实现腐蚀与膨胀的实例

    什么是形态学 要了解腐蚀之前,我们需要了解一个概念:形态学. 形态学,又名数学形态学(Mathematical Morphology),是图像处理过程中一个非常重要的研究方向.形态学主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要的意义,通常是图像理解时所使用的最本质的形状特征. 例如,在识别手写数字时,能够通过形态学运算得到其骨架信息,在具体的识别时,仅针对其骨架进行运算即可.形态学处理在视觉检测,文字识别,医学图像处理,图像压缩编码等领域都有非常重要的应用. 形态学操

  • C++ opencv图像处理实现图像腐蚀和膨胀示例

    目录 1 概念 2 膨胀 3 腐蚀 1 概念 1.1 腐蚀跟膨胀是最基本的形态学运算 1.2 腐蚀跟膨胀是对图像的白色的部分(亮光部分)进行操作 1.3 腐蚀是对亮光部分进行腐蚀 拥有比原图更小的亮光部分 1.4 膨胀是对亮光部分进行膨胀 拥有比原图更大的亮光部分 这里有一个误区 假如说在图片上的一个字,很多人都会认为膨胀是将图片上的字进行膨胀放大实则不然 可以看到膨胀是将图片上的亮色区域进行放大,字就会变得更小,结构体够大的情况下,字就会看不见了** 可以看到腐蚀是将图片上的亮色区域进行放小,

  • python opencv 检测移动物体并截图保存实例

    最近在老家找工作,无奈老家工作真心太少,也没什么面试机会,不过之前面试一家公司,提了一个有意思的需求,检测河面没有有什么船只之类的物体,我当时第一反应是用opencv做识别,不过回家想想,河面相对的东西比较少,画面比较单一,只需要检测有没有移动的物体不就简单很多嘛,如果做街道垃圾检测的话可能就很复杂了,毕竟街道上行人,车辆,动物,很多干扰物,于是就花了一个小时写了一个小的demo,只需在程序同级目录创建一个img目录就可以了 # -*-coding:utf-8 -*- __author__ =

  • Python图像运算之腐蚀与膨胀详解

    目录 前言 一.形态学理论知识 二.图像腐蚀 三.图像膨胀 四.总结 前言 这篇文章将详细讲解开始图像形态学知识,主要介绍图像腐蚀处理和膨胀处理.数学形态学(Mathematical Morphology)是一种应用于图像处理和模式识别领域的新方法.数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具,其基本思想是用具有一定形态的结构元素去量度和提取图像中对应形状以达到对图像分析和识别的目的. 一.形态学理论知识 数学形态学的应用可以简化图像数据,保持它们基本的形状特征,并出去不相

  • Python通过OpenCV的findContours获取轮廓并切割实例

    1 获取轮廓 OpenCV2获取轮廓主要是用cv2.findContours import numpy as np import cv2 im = cv2.imread('test.jpg') imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(imgray,127,255,0) image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_T

  • Python+OpenCV+pyQt5录制双目摄像头视频的实例

    起因 说起来录制视频,我们可能有很多的软件,但是比较坑的是,好像很少的软件支持能够同时录制两个摄像头的视频,于是我们用python自己写一个.要是OpenCV+python.貌似很简单就能OK的事情,但是,我们的项目不是一般要展示给老师看嘛.谁愿意看一个没有界面的录制过程是吧~,最后会附上源代码~ 依赖的包 在这里,我直接把import的包写出来了各位可以进行对号入座,然后就能知道需要安装哪个包啦! import cv2 import numpy as np from PyQt5.QtWidge

  • OpenCV+python手势识别框架和实例讲解

    基于OpenCV2.4.8和 python 2.7实现简单的手势识别. 以下为基本步骤 1.去除背景,提取手的轮廓 2. RGB->YUV,同时计算直方图 3.进行形态学滤波,提取感兴趣的区域 4.找到二值化的图像轮廓 5.找到最大的手型轮廓 6.找到手型轮廓的凸包 7.标记手指和手掌 8.把提取的特征点和手势字典中的进行比对,然后判断手势和形状 提取手的轮廓 cv2.findContours() 找到最大凸包cv2.convexHull(),然后找到手掌和手指的相对位置,定位手型的轮廓和关键点

  • python+opencv+caffe+摄像头做目标检测的实例代码

    首先之前已经成功的使用Python做图像的目标检测,这回因为项目最终是需要用摄像头的, 所以实现摄像头获取图像,并且用Python调用CAFFE接口来实现目标识别 首先是摄像头请选择支持Linux万能驱动兼容V4L2的摄像头, 因为之前用学ARM的时候使用的Smart210,我已经确认我的摄像头是支持的, 我把摄像头插上之後自然就在 /dev 目录下看到多了一个video0的文件, 这个就是摄像头的设备文件了,所以我就没有额外处理驱动的部分 一.检测环境 再来在开始前因为之前按着国嵌的指导手册安

  • python opencv判断图像是否为空的实例

    如下所示: import cv2 im = cv2.imread('2.jpg') if im is None: print("图像为空") # cv2.imshow("ss", im) # cv2.waitKey(0) 以上这篇python opencv判断图像是否为空的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

随机推荐