图像的膨胀(dilation)和腐蚀(erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域.
其中膨胀类似与 ‘领域扩张’ ,将图像的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大.
腐蚀类似 ‘领域被蚕食’ ,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小.
图像腐蚀:
让位于图像圆点的结构元素S在Z平面上移动,如果S的圆点移动到z点时,S能够完全的包含于A中,则认为这样的z点构成的集合是S对A的腐蚀图像。
下图左侧是原图X,B是结构元素,右图是腐蚀的结果。
腐蚀的方法是,拿B的中心点和X上的点一个一个地对比,如果B上的所有点都在X的范围内,则该点保留,否则将该点去掉;右边是腐蚀后的结果。可以看出,它仍在原来X的范围内,且比X包含的点要少,就象X被腐蚀掉了一层。图像腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。
opencv 参数含义:
MORPH_RECT: 产生矩形的结构元
MORPH_ELLIPSEM: 产生椭圆形的结构元
MORPH_CROSS: 产生十字交叉形的结构元
test.tif图像:
这里图像原本就是灰度图像。
#实验九,图像腐蚀 import cv2 import matplotlib.pyplot as plt I = cv2.imread('test.tif') # 创建矩形结构元 s = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) # 腐蚀图像,迭代次数采用默认值1 r = cv2.erode(I, s) # 边界提取 e = I - r # 显示原图和腐蚀后的结果 plt.figure() plt.imshow(I) plt.show() plt.figure() plt.imshow(r) plt.show() plt.figure() plt.imshow(e) plt.show()
图像膨胀:
1、原理
所谓的图片的膨胀处理,其实就是在图像的边缘添加像素值,使得整体的像素值扩张,进而达到图像的膨胀效果,也可以说是信号与系统书中所提到的像素插值处理。
对Z2上元素集合A和结构体元素S,使用S对A进行腐蚀,记作:
A⊕S={z|(S)z ∩ A ≠ Ø}
让位于图像圆点的结构元素S在Z平面上移动,如果S的圆点移动到z点时,S与A有公共的交集(非空集),则认为这样的z点构成的集合是S对A的膨胀图像。
下图左侧是原图X,B是结构元素,右图是膨胀的结果。膨胀的方法是,拿B的中心点和X上的点一个一个地对比,如果B上至少有一个点在X的范围内,则该点为前景有效点;右边是膨胀后的结果。可以看出,膨胀后的图比原图点数多,就象X被膨胀增加了一层。
#实验九,图像膨胀 import cv2 import matplotlib.pyplot as plt I = cv2.imread('test.tif') # 显示原图 cv2.imshow('origin', I) # 结构元半径 r = 1 MAX_R = 20 # 显示膨胀效果的窗口 cv2.namedWindow('dilate', 1) def nothing(*args): pass # 调整结构元半径 cv2.createTrackbar('r', 'dilate', r, MAX_R, nothing) while True: # 得到当前的r值 r = cv2.getTrackbarPos('r', 'dilate') # 创建结构元 s = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2*r+1, 2*r+1)) # 膨胀图像 d = cv2.dilate(I, s) # 显示膨胀效果 cv2.imshow('dilate', d) ch = cv2.waitKey(5) # 按esc退出循环 if ch == 27: break cv2.destroyAllWindows()
开运算和闭运算
cv2.morphologyEx(src, op, element[, dst[, anchor[, iterations[, borderType[, borderValue ]]]]])
MORPH_OPEN:开运算
MORPH_CLOSE:闭运算
MORPH_GRADIENT:形态梯度
MORPH_TOPHAT:顶帽运算
MORPH_BLACKHAT:底帽运算
开运算:先腐蚀后膨胀
#实验九,开运算 import cv2 as cv src = cv.imread('test.tif') # 结构元初始半径,最大半径 r, MAX_R = 0, 20 # 初始迭代次数,最大迭代次数 i, MAX_I = 0, 20 # 创建窗口 cv.namedWindow('morphology') # 设置回调函数 def nothing(*args): pass # 创建滑动条,分别为半径和迭代次数 cv.createTrackbar('r', 'morphology', r, MAX_R, nothing) cv.createTrackbar('i', 'morphology', i, MAX_I, nothing) while True: # 得到进度条上当前的r值 r = cv.getTrackbarPos('r', 'morphology') # 得到进度条上当前的i值 i = cv.getTrackbarPos('i', 'morphology') # 创建结构元 kernel = cv.getStructuringElement(cv.MORPH_RECT, (2 * r + 1, 2 * r + 1)) # 形态学处理:开运算 result = cv.morphologyEx(src, cv.MORPH_OPEN, kernel, iterations=i) # 显示效果 cv.imshow('morphology', result) # 按Esc退出 ch = cv.waitKey(5) if ch == 27: break cv.destroyAllWindows()
闭运算:先膨胀后腐蚀
#实验九,闭运算 import cv2 as cv src = cv.imread('test.tif') # 结构元初始半径,最大半径 r, MAX_R = 0, 20 # 初始迭代次数,最大迭代次数 i, MAX_I = 0, 20 # 创建窗口 cv.namedWindow('morphology') # 设置回调函数 def nothing(*args): pass # 创建滑动条,分别为半径和迭代次数 cv.createTrackbar('r', 'morphology', r, MAX_R, nothing) cv.createTrackbar('i', 'morphology', i, MAX_I, nothing) while True: # 得到进度条上当前的r值 r = cv.getTrackbarPos('r', 'morphology') # 得到进度条上当前的i值 i = cv.getTrackbarPos('i', 'morphology') # 创建结构元 kernel = cv.getStructuringElement(cv.MORPH_RECT, (2 * r + 1, 2 * r + 1)) # 形态学处理:闭运算 result = cv.morphologyEx(src, cv.MORPH_CLOSE, kernel, iterations=i) # 显示效果 cv.imshow('morphology', result) # 按Esc退出 ch = cv.waitKey(5) if ch == 27: break cv.destroyAllWindows()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)