OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

  • 四、图像形态学操作
    • 4.1 腐蚀和膨胀
      • 4.1.1 图像腐蚀
      • 4.1.2 图像膨胀
    • 4.2 开运算与闭运算
      • 4.2.1 开运算
      • 4.2.2 闭运算
    • 4.3 形态学梯度(Gradient)
    • 4.4顶帽和黑帽

有关图像处理前三次的笔记:
OpenCV与图像处理学习三——图像基本操作(1)
OpenCV与图像处理学习四——图像基本操作(2)
OpenCV与图像处理学习五——图像基本操作(3)

这是有关图像基本操作的最后一次笔记,有关图像形态学操作。

四、图像形态学操作

形态学,是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质的形状特征,如边界和连通区域等。

下面会经常用到一个概念,这里先进行说明:

结构元素:设有两幅图像B,X,若X是被处理的对象,而B是用来处理X的,则B称为结构元素(structure element),又被形象地称作刷子。结构元素通常都是一些比较小的图像。

下面将介绍形态学的几种常用操作:腐蚀、膨胀、开运算和闭运算等。

4.1 腐蚀和膨胀

图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,其中膨胀类似于“领域扩张”,将图像中的白色部分进行扩张,其运行结果图比原图的白色区域更大;而腐蚀类似于“领域被蚕食”,将图像中白色的部分进行缩减细化,其运行结果图比原图的白色区域更小。

4.1.1 图像腐蚀

把结构元素B平移a后得到Ba,若Ba包含于X,我们记下这个a点,所有满足上述条件的a点组成的集合称作X被B腐蚀(Erosion)的结果。如下图所示:
在这里插入图片描述
其中X是被处理的对象,B是结构元素。对于任意一个在阴影部分的点a,Ba包含于X,所以X被B腐蚀的结果就是那个阴影部分。阴影部分在X的范围之内,且比X小,就像X被剥掉了一层似的。

在这里插入图片描述
腐蚀后的结果如下图黑色部分所示:
在这里插入图片描述
相较于原来的灰色部分,仿佛变瘦了。

OpenCV中的函数为:

dst	= cv2.erode( src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] )

参数为:

  1. src:输入图像,可以是灰度图或彩色图。
  2. kernel:腐蚀操作的结构元素,默认为一个3×3的简单矩阵。
  3. anchor:锚点,默认为结构元素的中心。
  4. iterations:腐蚀次数,默认为1。

下面看个例子:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('./image/morphology.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
kernel = np.ones((3, 3), np.uint8)
erosion = cv2.erode(img, kernel, iterations = 1)
plt.subplot(121), plt.imshow(img), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(erosion), plt.title('erosion')
plt.xticks([]), plt.yticks([])
plt.show()

结果如下所示:
在这里插入图片描述
若将结构元素的尺寸扩大到7,结果为:
在这里插入图片描述
ps:在构造结构元素的时候,可以使用numpy,也可以使用OpenCV提供的函数cv2.getStructuringElement()

函数:

retval = cv2.getStructuringElement( shape, ksize[, anchor] )

参数:

  1. shape:结构元素内部的结构,有三种,分别是矩形、十字形和椭圆形:在这里插入图片描述
  2. ksize:结构元素的尺寸。
  3. anchor:锚点位置,默认为中心位置。

看一下例子:

import numpy as np
import cv2kernel = np.ones((5, 5), np.uint8)
print(kernel)
[[1 1 1 1 1][1 1 1 1 1][1 1 1 1 1][1 1 1 1 1][1 1 1 1 1]]
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (7,7))
print(kernel)
[[0 0 0 1 0 0 0][0 0 0 1 0 0 0][0 0 0 1 0 0 0][1 1 1 1 1 1 1][0 0 0 1 0 0 0][0 0 0 1 0 0 0][0 0 0 1 0 0 0]]
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7,7))
print(kernel)
[[0 0 0 1 0 0 0][0 1 1 1 1 1 0][1 1 1 1 1 1 1][1 1 1 1 1 1 1][1 1 1 1 1 1 1][0 1 1 1 1 1 0][0 0 0 1 0 0 0]]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7,7))
print(kernel)
[[1 1 1 1 1 1 1][1 1 1 1 1 1 1][1 1 1 1 1 1 1][1 1 1 1 1 1 1][1 1 1 1 1 1 1][1 1 1 1 1 1 1][1 1 1 1 1 1 1]]

我们可以用非矩形的结构元素来进行腐蚀操作:

#!/usr/bin/env python3
import cv2image = cv2.imread("./image/morphology.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray Image", gray)kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
eroded = cv2.erode(gray.copy(), kernel, 10)
# eroded = cv2.erode(gray.copy(), None, 10)cv2.imshow("Eroded Image", eroded)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
也是可以达到一定效果的,但是比矩形的那种腐蚀程度低一些些,因为毕竟结构元素里多了一些0。

4.1.2 图像膨胀

膨胀(dilation)可以看做是腐蚀的对偶运算,其定义是:把结构元素B平移后得到Ba,若Ba与X有交集,我们记下这个a点。所有满足上述条件的a点组成的集合称作X被B膨胀后的结果,如下图所示:
在这里插入图片描述
其中X是被处理的对象,B是结构元素,对于任意一个在阴影部分的点a,Ba与X有交集,所以X被B膨胀后的结果就是那个阴影部分,阴影部分包括X所有范围,就像是X膨胀了一圈似的。
在这里插入图片描述
膨胀后的图像,其中绿色是膨胀多出来的部分:
在这里插入图片描述
在OpenCV中的函数为:

dst	= cv2.dilate( src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] )

参数:

  1. src:输入图像,可以是灰度图也可以是彩色图。
  2. kernel:膨胀运算的结构元素,默认为一个3×3的简单矩阵。
  3. anchor:同上。
  4. iterations:同上。

看个例子:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('./image/morphology.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#kernel = np.ones((3,),np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7,7))dilation = cv2.dilate(img,kernel,iterations = 1)
plt.subplot(121),plt.imshow(img),plt.title('origin')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dilation),plt.title('dilation')
plt.xticks([]), plt.yticks([])
plt.show()

结果为:
在这里插入图片描述
若将运算元素尺寸扩大一点,扩大为11:
在这里插入图片描述
原本断开的地方或小孔都被填上了。

4.2 开运算与闭运算

4.2.1 开运算

开运算 = 先腐蚀运算,再膨胀运算,看上去把细微连在一起的两块目标分开了,开运算的效果图如下所示:
在这里插入图片描述
开运算对一些细微的小点,小块,细条等部分是可以消去的,因为先腐蚀消去它们,导致它们消失了无法再通过膨胀变回来,而一些比较大的块通过腐蚀操作只是会变瘦一点,不会被完全抹去,所以可以通过膨胀运算变回来,那么总的效果就是开运算去除了这些孤立的小点,细长的小条。

开运算总结:

  1. 开运算能够去除孤立的小点,毛刺和小条,而总的位置和形状不变。
  2. 开运算是一个基于几何运算的滤波器。
  3. 结构元素大小的不同将导致滤波效果的不同。
  4. 不同的结构元素的选择导致了不同的分割,即提取出不同的特征。

开运算和闭运算都用如下函数来表示,这个函数是OpenCV中图像形态学变化的通用函数:

dst	= cv2.morphologyEx( src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] )

参数如下所示:

  1. src:输入图像,灰度图或彩色图均可。
  2. op:形态学操作的类型,包括腐蚀、运算、开运算以及后面要提及的闭运算、形态学梯度、顶帽、黑帽等类型。在这里插入图片描述
  3. kernel:结构元素,可以使用cv2.getStructuringElement函数来定义。
  4. anchor:锚点位置,一般都用中心位置。
  5. iterations:腐蚀或膨胀的次数。

下面看个例子:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('./image/open.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#kernel = np.ones((5,5),np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
plt.subplot(121), plt.imshow(img), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(opening), plt.title('opening')
plt.xticks([]), plt.yticks([])
plt.show()

结果如下所示:
在这里插入图片描述
一些细小的点被去除了很多,但是开运算的结构元素的尺寸很重要,太小可能去除效果不好,太大可能会得到不想要的结果,如将3改为9,结果将变为:
在这里插入图片描述
所以调节这个参数还是很关键的。

4.2.2 闭运算

闭运算 = 先膨胀运算,再腐蚀运算,看上去将两个细微连接的图块封闭在一起,闭运算的效果图如下图所示:
在这里插入图片描述
闭运算总结:

  1. 闭运算能够填平小孔,弥合小缝隙,而总的位置和形状不变。
  2. 闭运算是通过填充图像的凹角来滤波图像的。
  3. 结构元素大小的不同将导致滤波效果的不同。
  4. 不同结构元素的选择导致了不同的分割。

看个例子:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img = cv.imread('./image/close.png')
img = cv.cvtColor(img,cv.COLOR_BGR2RGB)
# kernel = np.ones((5,5),np.uint8)
kernel = np.ones((7, 7), np.uint8)
closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
plt.subplot(121), plt.imshow(img), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(closing), plt.title('closing')
plt.xticks([]), plt.yticks([])
plt.show()

结果如下所示:
在这里插入图片描述
一些小孔被填满了。若把尺寸从7改为21,结果为:
在这里插入图片描述
就有点过了,把不需要连接和填补的地方也给连接、填补了,所以要合理选择参数。

4.3 形态学梯度(Gradient)

  1. 基础梯度:基础梯度是用膨胀后的图像减去腐蚀后的图像得到的差值图像,也是OpenCV中支持的计算形态学梯度的方法,而此方法得到梯度又称为基本梯度。
  2. 内部梯度:是用原图减去腐蚀之后的图像得到的差值图像。
  3. 外部梯度:图形膨胀后再减去原来图像得到的差值图像。

cv2.morphologyEx函数可以实现基础梯度操作,看下面这个例子:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img = cv.imread('./image/morphology.png')
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
kernel = np.ones((3, 3), np.uint8)
gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)
plt.subplot(121), plt.imshow(img), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(gradient), plt.title('gradient')
plt.xticks([]), plt.yticks([])
plt.show()

结果如下所示:
在这里插入图片描述

4.4顶帽和黑帽

  • 顶帽(Top Hat):原图像与开运算图的差值,突出原图像中比周围亮的区域
  • 黑帽(Black Hat):闭运算图与原图的差值,突出原图中比周围暗的区域

看两个例子:

顶帽:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img = cv.imread('./image/morphology.png')
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
kernel = np.ones((9, 9), np.uint8)
tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
plt.subplot(121), plt.imshow(img), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(tophat), plt.title('tophat')
plt.xticks([]), plt.yticks([])
plt.show()

结果为:
在这里插入图片描述
黑帽:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img = cv.imread('./image/morphology.png')
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
kernel = np.ones((9, 9), np.uint8)
tophat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)
plt.subplot(121), plt.imshow(img), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(tophat), plt.title('blackhat')
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述
图像处理之图像基本操作的笔记就暂时到这里,后面将学习传统方法进行图像分割,包括阈值分割、边缘检测算法、连通域分析以及一些其他区域生长算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解密硅谷大骗局

来源:硅谷封面企鹅号、腾讯科技在许多为人称道的科技创业故事中,总不乏硅谷的名字。从英特尔、IBM到微软、苹果,从雅虎、谷歌到Twitter、Facebook,这里诞生了很多知名科技企业。对于全球的创业者来说,硅谷就是梦想中的…

OpenCV与图像处理学习七——传统图像分割之阈值法(固定阈值、自适应阈值、大津阈值)

OpenCV与图像处理学习七——传统图像分割之阈值法(固定阈值、自适应阈值、大津阈值)一、固定阈值图像分割1.1 直方图双峰法1.2 OpenCV中的固定阈值分割二、自动阈值图像分割2.1 自适应阈值法2.2 迭代法阈值分割2.3 Otsu大津阈值法前面的笔记介绍了一些Op…

Foxmail 绑定企业邮箱

转载于:https://www.cnblogs.com/wu628/p/4955017.html

边缘计算将吞掉云计算!

来源:CSDN以下为译文:边缘计算已成为物联网的重要趋势。高德纳咨询公司认为边缘计算是2019年的一项技术趋势。各个物联网公司发现在将数据发送到云之前,通过边缘计算处理数据有很大的好处。最近Micron/Forrester的调查证实了这一趋势&#xf…

OpenCV与图像处理学习八——图像边缘提取(Canny检测代码)

OpenCV与图像处理学习八——图像边缘提取(Canny检测代码)一、图像梯度1.1 梯度1.2 图像梯度二、梯度图与梯度算子2.1模板卷积2.2 梯度图2.3 梯度算子2.3.1 Roberts交叉算子2.3.2 Prewitt算子2.3.3 Sobel算子三、Canny边缘检测算法(代码实现&a…

面向人工智能的计算机体系结构

来源:计算机研究与发展前 言近几年来人工智能技术的飞速发展使得其应用迅猛扩大,而传统的计算机体系结构对于面向人工智能的应用在处理速度、能耗、使用的方便性等方面有着诸多不足。随着人工智能应用的发展,面向人工智能的体系结构成为体系结…

OpenCV与图像处理学习九——连通区域分析算法(含代码)

OpenCV与图像处理学习九——连通区域分析算法(含代码)一、连通区域概要二、Two-Pass算法三、代码实现一、连通区域概要 连通区域(Connected Component)一般是指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域&#x…

(180页PPT)|清华大学孙富春教授深度讲解: 人工智能技术与产业发展

来源:精智工厂[导读】本文是清华大学孙富春教授在机械工业出版社讲座交流PPT,孙教授从背景与历史、深度学习、脑认知、产业(装备)发展、发展趋势等五个方面详细解读了人工智能技术与产业发展。未来智能实验室是人工智能学家与科学…

OpenCV与图像处理学习十——区域生长算法(含代码)

OpenCV与图像处理学习十——区域生长算法(含代码)一、区域生长算法概要二、区域生长算法原理三、代码应用一、区域生长算法概要 区域生长是一种串行区域分割的图像分割方法。区域生长是指从某个像素出发,按照一定的准则,逐步加入…

FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated

使用scipy模块时出现警告:FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use arr[tuple(seq)] instead of arr[seq]. In the future this will be interpreted as an array index, arr[np.array(seq)], which will resu…

一文看懂中国MEMS传感器产业链

来源:通信产业网物联网对促进我国经济发展、优化产业结构具有重大的战略意义。而在整个物联网生态中,MEMS传感器扮演着越来越重要的角色,在即将到来的智能物联网时代中将起到核心作用,为新科技产品提供更智能、更敏锐的感知能力。…

OpenCV与图像处理学习十一——分水岭算法(含代码)

OpenCV与图像处理学习十一——分水岭算法(含代码)一、分水岭算法概要二、分水岭算法步骤三、代码应用一、分水岭算法概要 任意的灰度图像可以被看做是地质学表面,高亮度的地方是山峰,低亮度的地方是山谷。 给每个孤立的山谷&…

10件5G能实现但4G不能做的事情

来源:雷锋网 5G的一些最佳用途可能还没有被发现,但下面是我们已经知道的十个令人兴奋的用途。雷锋网按;2019年6月6日,工信部正式向中国电信、中国移动、中国联通、中国广电发放5G商用牌照,这表明中国正式进入了5G商用的…

OpenCV与图像处理学习十二——图像形状特征之HOG特征

OpenCV与图像处理学习十二——图像形状特征之HOG特征一、图像特征理解1.1 颜色特征1.2 纹理特征1.3 形状特征1.4 空间关系特征二、形状特征描述2.1 HOG特征2.1.1 基本概念2.1.2 HOG实现过程2.1.3 代码实现前面介绍了图像的基础知识、基本处理方法以及传统图像分割的应用&#x…

深度解读:5G正式发牌,国内通信市场冷暖预判

来源:ICT解读者2019年6月6日,工业和信息化部向中国电信、中国移动、中国联通和中国广电正式颁发5G牌照,批准四家企业经营“第五代数字蜂窝移动通信业务”。这标志着我国正式进入5G商用元年。一石激起千层浪,相较于此前各运营商官方…

OpenCV与图像处理学习十三——Harris角点检测(含代码)

OpenCV与图像处理学习十三——Harris角点检测(含代码)一、角点的概念二、Harris角点检测的实现过程三、Harris代码应用一、角点的概念 角点: 在现实世界中, 角点对应于物体的拐角, 道路的十字路口、 丁字路口等。 从…

德勤发布《中国智能制造分析报告》

来源:CIO俱乐部亚洲正受到自动化、智能化大潮冲击。国际劳工组织调研发现,越南、柬埔寨、菲律宾和印度尼西亚的工人的失业风险最高,据估计这几个区域约50%的工人工作可能在未来20年被自动化取代。亚洲尤其是中国作为制造业的重要区域&#xf…

OpenCV与图像处理学习十四——SIFT特征(含代码)

OpenCV与图像处理学习十四——SIFT特征(含代码)一、SIFT算法二、SIFT实现过程三、代码实现一、SIFT算法 SIFT, 即尺度不变特征变换算法(Scale-invariant feature transform,SIFT) , 是用于图像…

液态大脑与固态大脑——圣塔菲最新群体智能文集

来源:The Royal society撰文 | Ricard Sol, Melanie Moses, and Stephanie Forrest大脑,神经元构成的器官根植于许多生物体内。这是一种固态的大脑,且组成它们的元素在空间中相对固定。但是相对的,大脑是否可以拥有流动不定的存在…

OpenCV与图像处理学习十五——LBP纹理特征(含代码)

OpenCV与图像处理学习十五——LBP纹理特征(含代码)一、LBP介绍二、LBP原理三、代码应用一、LBP介绍 LBP(Local Binary Pattern, 局部二值模式) , 是一种用来描述图像局部纹理特征的算子; 它具有…