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