Morphological image processing

目录

基本思想:

一.集合论基础

1.集合的概念

2.集合间的关系和运算

二.二值形态学的基本运算

1.腐蚀

(1)概念

(2)结构元素形状对腐蚀运算结果的影响

(3)腐蚀运算在物体识别中的应用

2.膨胀

(1)概念

2.膨胀运算的基本过程

(2)结构元素形状对膨胀运算结果的影响

(3)膨胀运算的应用

(4)腐蚀运算与膨胀运算的对偶性

3.开运算与闭运算

(1)开运算

(2)闭运算

(3)开运算与闭运算对偶性

三.综上代码实现

1.函数说明

(1)getStructuringElement函数

(2)erode函数

(3)dilate函数

(4)morphologyEx函数

2.代码实现


基本思想:

数学形态学图像处理的基本思想是:用具有一定形态的结构元素(是指具有某种特定结构形状的基本元素,例如一定大小的矩形、圆或者菱形等)探测目标图像,通过检验结构元素在图像目标中的可放性和填充方法的有效性,来获取有关图像形态结构的相关信息,进而达到对图像分析和识别的目的。

一.集合论基础

1.集合的概念

所谓集合是指能作为整体论述的事物的集体。
集合在数学形态学中用于表示图像中的不同对象,比如在二值图像中,通常用所有值为“1”的像素的集合表示前景(目标),而用所有值为“0”的像素的集合表示图像的背景。

2.集合间的关系和运算

就是关于原点对称

二.二值形态学的基本运算

1.腐蚀

(1)概念

腐蚀运算的含义:每当在目标图像A中找到一个与结构元素B相同的子图像时,就把该子图像中与B的原点位置对应的那个像素位置标注为1,图像A上标注出的所有这样的像素组成的集合,即为腐蚀运算的结果。

注意:当结构元素在目标图像上平移时,结构元素中的任何元素不能超出目标图像的范围。

 一个实例生动形象

(2)结构元素形状对腐蚀运算结果的影响

腐蚀运算的结果不仅与结构元素的形状(矩形、圆形、菱形等)选取有关,而且还与原点位置的选取有关。

(3)腐蚀运算在物体识别中的应用

2.膨胀

(1)概念

2.膨胀运算的基本过程

注意:
(1)当结构元素中原点位置的值是0时,仍把它看作是0;而不再把它看作是1。
(2)当结构元素在目标图像上平移时,允许结构元素中的非原点像素超出目标图像范围。

反射集合B的原点不改变,而是模板上的其他点关于原点做反射(关于原点对称)!!!!

当模板和移动到的区域原点位置一样时,则跳过就行!!!

(2)结构元素形状对膨胀运算结果的影响

当目标图像不变,但所给的结构元素的形状改变时;或结构元素的形状不变,而其原点位置改变时,膨胀运算的结果都会发生改变。

(3)膨胀运算的应用

(4)腐蚀运算与膨胀运算的对偶性

3.开运算与闭运算

(1)开运算

(2)闭运算

(3)开运算与闭运算对偶性

三.综上代码实现

1.函数说明

(1)getStructuringElement函数

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

Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));

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

矩形:MORPH_RECT;

交叉形:MORPH_CROSS;

椭圆形:MORPH_ELLIPSE;

第二和第三个参数分别是内核的尺寸以及锚点的位置。一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。

(2)erode函数

src:源图像

kernel:腐蚀操作的内核。我们一般使用函数 getStructuringElement 配合这个参数的使用。getStructuringElement 函数会返回指定形状和尺寸的结构元素(内核矩阵)。

dst:返回图像

anchor:锚点的位置,其有默认值(-1,-1),表示锚位于单位(element)的中心,我们一般不用管它。

iterations:迭代使用 erode()函数的次数,默认值为 1。

borderType:用于推断图像外部像素的某种边界模式。注意它有默认值 BORDER_DEFAULT。

borderValue:当边界为常数时的边界值,有默值 morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的 createMorphologyFilter()函数得到更详细的解释。

(3)dilate函数

和erode函数参数一样

(4)morphologyEx函数

op:使用的形态学方法

2.代码实现

import cv2 as cv
import matplotlib.pyplot as plt

filename ='/home/image/Pictures/lena256.jpg'
img = cv.imread(filename,0)
# 矩形:MORPH_RECT;
# 交叉形:MORPH_CROSS;
# 椭圆形:MORPH_ELLIPSE;
kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))#构造一个椭圆形模板
print(kernel)
# 腐蚀 erode : anchor=(-1,-1)锚点(内核中心点),iterations定义腐蚀次数
erosion = cv.erode(img,kernel,anchor=(-1,-1),iterations = 1)
# edge
img1 = img -erosion
# 膨胀 dilate :格式同上函数
dilation = cv.dilate(img,kernel,iterations = 1)
#开运算:先腐蚀,再膨胀,可清除一些小东西(亮的),放大局部低亮度的区域
tophat1 = cv.morphologyEx(img, cv.MORPH_OPEN, kernel)
#闭运算:先膨胀,再腐蚀,可清除小黑点

tophat2 = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
plt.subplot(231),plt.imshow(img,cmap='gray'),plt.title("orinal"),plt.xticks([]),plt.yticks([])
plt.subplot(232),plt.imshow(erosion,cmap='gray'),plt.title("eroson"),plt.xticks([]),plt.yticks([])
plt.subplot(233),plt.imshow(img1,cmap='gray'),plt.title("original-erosion=edge"),plt.xticks([]),plt.yticks([])
plt.subplot(234),plt.imshow(dilation,cmap='gray'),plt.title("dilate"),plt.xticks([]),plt.yticks([])
plt.subplot(235),plt.imshow(tophat1,cmap='gray'),plt.title("cv.MORPH_OPEN"),plt.xticks([]),plt.yticks([])
plt.subplot(236),plt.imshow(tophat2,cmap='gray'),plt.title("cv.MORPH_CLOSE"),plt.xticks([]),plt.yticks([])

plt.show()

猜你喜欢

转载自blog.csdn.net/weixin_44593822/article/details/106230737