【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)

  • 转载博客请注明详细地址,谢谢
  • 本文讲了形态学基本操作膨胀腐蚀开闭操作的原理
  • 本文讲解了用OpenCV-Python实现形态学操作

目录

 

一、形态学简述

1、简介

2、一些基本定义

3、结构元素

(1)什么是结构元素

(2)常用的结构元素

(3)结构元素的创建方法(numpy和opencv)

二、形态学膨胀与腐蚀(以二值图像为例)

1、膨胀(dilate)

(1)概念

(2)准则

(3)实质

2、腐蚀(erode)

(1)概念

(2)准则

(3)实质

3、Python_opencv中膨胀腐蚀的代码函数

4、实例

三、形态学开闭操作

1、开操作

(1)概念

(2)作用

2、闭操作

(1)概念

(2)作用

3、Python_opencv中开闭操作的代码函数

4、实例

四、形态学基本操作汇总

1、形态学的主要功能

2、腐蚀与膨胀

3、其他操作

五、参考文献


一、形态学简述

这里只是进行简单的介绍,重点在于代码的实现以及核心原理,具体形态学的知识可以参考以下文章:

https://wenku.baidu.com/view/e54eb9435122aaea998fcc22bcd126fff6055dcc.html

1、简介

【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)_第1张图片

2、一些基本定义

【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)_第2张图片

【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)_第3张图片

【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)_第4张图片

【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)_第5张图片

【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)_第6张图片

3、结构元素

(1)什么是结构元素

结构元素就是一个类似于核的一个矩阵,numpy矩阵,其作用主要是用于形态学的各种操作进行类卷积的操作,不同的结构元素得到的形态学操作的结果也是不一样的。元素值由0和1组成,根据1所填充的区域形状可以将结构元素分为以下常见的结构元素有:椭圆、方形、菱形。

结构元素的选择我们应该根据我们所需要处理的图像的特点来进行选择,如一个二值图像的内部轮廓比较规整,可以分成一个个小小的矩形,则可以选择矩形结构元素,这样可以比较好地贴合理想的结果。

(2)常用的结构元素

结构元素一般默认将形状的中心作为参考点,用于与待处理图像的像素点进行贴合

【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)_第7张图片

(3)结构元素的创建方法(numpy和opencv)

利用numpy创建矩阵,元素为0和1,根据设置1的位置可以创建出不同类型的结构元素

numpy.array([[...],[...],...)

利用opencv_python自带的函数getStructringElement()进行创建

cv2.getStructuringElement(kernel_type,(ksize.ksize))

参数解析:

 1)kernel_type:创建结构元素的类型,有矩形、十字形等(其他顶帽、梯度等是形态学的其他操作,不是结构元素的类型)

【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)_第8张图片

2)ksize:结构元素的大小,一般为奇数,常用的有3和5,越大其腐蚀和膨胀的程度就越大

strc_ele = np.array([[1,1,1],
                     [1,1,1],
                     [1,1,1]])
struc_ele = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

二、形态学膨胀与腐蚀(以二值图像为例)

1、膨胀(dilate)

(1)概念

二值图像的膨胀实质上就是用结构元素去扫描整个图像,其实就是将结构元素的中心和图像的目标像素点进行重合,然后将结构元素和目标像素点邻域相对应的元素值进行相乘,然后将大值赋值给目标像素点作为值,在二值图中只有0和255两个灰度值(灰度图膨胀就是将对应元素值相加,将最大值赋值给目标像素点)

(2)准则

二值图膨胀准则:输出值的值就是输入点邻域值的最大值

灰度图膨胀准则:输出值的值就是输入点邻域值加上结构元素相对应值的和的最大值

(3)实质

只要重叠的区域有1,则将目标像素点的灰度值设置为255,白色

【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)_第9张图片

2、腐蚀(erode)

(1)概念

二值图像的腐蚀实质上就是用结构元素去扫描整个图像,其实就是将结构元素的中心和图像的目标像素点进行重合,然后将结构元素和目标像素点邻域相对应的元素值进行相乘,然后将小值赋值给目标像素点作为值,在二值图中只有0和255两个灰度值(灰度图腐蚀就是将对应元素值相减,将最小值赋值给目标像素点)

(2)准则

二值图腐蚀准则:输出值的值就是输入点邻域值的最小值

灰度图腐蚀准则:输出值的值就是输入点邻域值加上结构元素相对应值的差的最小值

(3)实质

构元素类似于卷积一样在输入图像上移动,从输入数据的坐标(0,0)开始,结构元素的中心与(0,0)重合,如果结构元素中的1与它所覆盖的区域的1完全重合时,才能把结构元素中心与输入相对应的坐标值赋值为1,否则为0。注意在计算过程中不改变原始数据,输出矩阵为单独的矩阵。下图为计算过程的分析:

待测二值图像中,1表示255白色,0表示0黑色

【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)_第10张图片

 

 

3、Python_opencv中膨胀腐蚀的代码函数

erode_img = cv2.erode(src,kernel)#腐蚀
dilate_img = cv2.dilate(src,kernel)#膨胀

参数解析:

1)src:待处理的图像,一般是二值图像和灰度图像

2)kernel:指定要使用的结构元素

4、实例

import cv2
import numpy as np

img = 'colorful_lena.jpg'
gray = cv2.imread(img,0)#读取并灰度化
binary = cv2.threshold(gray,49,255,cv2.THRESH_BINARY)[1]#二值化
struc_ele = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))#创建结构元素

erode_img = cv2.erode(binary,struc_ele)#腐蚀
dilate_img = cv2.dilate(binary,struc_ele)#膨胀

#图像显示
cv2.imshow('gray',gray)
cv2.imshow('binary',binary)
cv2.imshow('erode',erode_img)
cv2.imshow('dilate',dilate_img)
cv2.waitKey(0)

这里是以矩形3x3的结构元素进行的膨胀和腐蚀操作

【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)_第11张图片

三、形态学开闭操作

1、开操作

(1)概念

开操作就是对待测图像使用同一个结构元素先进行腐蚀再进行膨胀操作

(2)作用

一般来说,开运算能够去除孤立的小点,毛刺和小桥(即连通两块区域的小点),而总的位置和形状不变,这就是开运算的作用。

【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)_第12张图片

2、闭操作

(1)概念

闭操作就是对待测图像用同一个结构元素先进行膨胀操作再进行腐蚀操作

(2)作用

闭操作能够填平小湖(即小孔),弥补小缝,但是图像的大小位置不会改变

【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)_第13张图片

3、Python_opencv中开闭操作的代码函数

closed_img = cv2.morphologyEx(src,cv2.MORPH_CLOSE,kernel)#闭
opend_img = cv2.morphologyEx(binary,cv2.MORPH_OPEN,kernel)#开

 参数解析:

1)src:待处理图像

2)kernel:结构元素

4、实例

import cv2
import numpy as np

img = 'colorful_lena.jpg'
gray = cv2.imread(img,0)#读取并灰度化
binary = cv2.threshold(gray,49,255,cv2.THRESH_BINARY)[1]#二值化
struc_ele = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))#创建结构元素

closed_img = cv2.morphologyEx(binary,cv2.MORPH_CLOSE,struc_ele)#闭
opend_img = cv2.morphologyEx(binary,cv2.MORPH_OPEN,struc_ele)#开

#图像显示
cv2.imshow('gray',gray)
cv2.imshow('binary',binary)
cv2.imshow('closed',closed_img)
cv2.imshow('opend',opend_img)
cv2.waitKey(0)

【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)_第14张图片

四、形态学基本操作汇总

所有的操作都可以根据原理自己编程这里不再赘述

1、形态学的主要功能

       形态学基本操作主要有:膨胀和腐蚀两大类,其功能主要为:消除噪声;分割出独立的图像元素,在图像中连接相邻的元素;寻找图像中的明显的极大值区域或极小值区域;求出图像的梯度。

2、腐蚀与膨胀

       腐蚀和膨胀是针对于图像中的高亮部分而言的,膨胀是图像中高亮部分进行膨胀,类似于“临域膨胀”,效果图的高亮部分比原图像大;腐蚀则与之相反。
       膨胀的原理:膨胀就是求图像像素局部最大值的操作。膨胀/腐蚀就是将图像或图像的一部分与核进行卷积。(核可以任意大小,可以是一个小的、中间带着参考点的实心正方型)。核和图像部分卷积,计算出核覆盖区域像素点的最大值,并将这个最大值赋值给参考点所在像素。
       腐蚀与膨胀相反,是用来求局部像素最小值的算法。

3、其他操作

高级形态学操作则是基于腐蚀和膨胀演化的操作。


开运算:
原理:先腐蚀后膨胀;
用途:用与消除小物体,在纤细点处分离物体,并在平滑较大物体的边界不明显改变其面积。


闭运算:
原理:先膨胀后腐蚀
用途:用于消除图像中的小型黑色区域。


形态学梯度:
原理:图像的膨胀图和腐蚀图变化之差
用途:用来保留物体的边缘轮廓


顶帽运算:
原理:是原图像与开运算效果图之差。因为开运算带来的结果是放大了裂缝或者局部低亮的区域,因此从原图减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域。
用途:顶帽运算往往用来分离比邻近点亮的斑块。在一幅图像中拥有大幅背景而微小物品比较有规律的情况下可以使用顶帽运算进行背景提取。


黑帽运算:
原理:计算闭运算效果图与原图像之差,突出了比原图轮廓周围的区域更暗的区域。
用途:用来分离比邻近点暗的一些斑块。

五、参考文献

https://blog.csdn.net/Fcc_bd_stars/article/details/99706125

https://blog.csdn.net/Aidam_Bo/article/details/104469098

https://blog.csdn.net/qq_35859033/article/details/80210264

https://wenku.baidu.com/view/e54eb9435122aaea998fcc22bcd126fff6055dcc.html

https://wenku.baidu.com/view/7ea9d65d312b3169a451a487.html?sxts=1594347309006

你可能感兴趣的:(图像处理,python,opencv,图像处理)