Python+OpenCV:形态学变换
理论
形态学变换是基于图像形状的一些简单操作。
它通常在二值图像上执行。它需要两个输入,一个是我们的原始图像,另一个是结构元素(structuring element)或核(kernel),它决定了操作的性质。
两个基本的形态算子是Erosion和Dilation。然后它的变体形式,如Opening, Closing, Gradient等也发挥作用。
####################################################################################################
# 形态学变换
def lmc_cv_morphological_transformations(index):
"""
函数功能: 形态学变换.
形态学变换是基于图像形状的一些简单操作。
它通常在二值图像上执行。它需要两个输入,一个是我们的原始图像,另一个是结构元素(structuring element)或核(kernel),它决定了操作的性质。
两个基本的形态算子是Erosion和Dilation。然后它的变体形式,如Opening, Closing, Gradient等也发挥作用。
"""
# 读取图像
image = lmc_cv.imread('D:/99-Research/Python/Image/j.png')
# image = lmc_cv.cvtColor(image, lmc_cv.COLOR_RGB2BGR)
# 创建核
kernel = np.ones((9, 9), np.uint8)
# 创建核:Rectangular Kernel
if 0 == index:
kernel = lmc_cv.getStructuringElement(lmc_cv.MORPH_RECT, (3, 3))
# 创建核:Elliptical Kernel
if 1 == index:
kernel = lmc_cv.getStructuringElement(lmc_cv.MORPH_ELLIPSE, (5, 5))
# 创建核:Cross-shaped Kernel
if 2 == index:
kernel = lmc_cv.getStructuringElement(lmc_cv.MORPH_CROSS, (7, 7))
# Erosion
erosion_image = lmc_cv.erode(image, kernel, anchor=(-1, -1), iterations=1, borderType=lmc_cv.BORDER_DEFAULT)
# Dilation
dilation_image = lmc_cv.dilate(image, kernel, anchor=(-1, -1), iterations=1, borderType=lmc_cv.BORDER_DEFAULT)
# Opening
opening_image = lmc_cv.morphologyEx(image, lmc_cv.MORPH_OPEN, kernel, anchor=(-1, -1), iterations=1,
borderType=lmc_cv.BORDER_DEFAULT)
# Closing
closing_image = lmc_cv.morphologyEx(image, lmc_cv.MORPH_CLOSE, kernel, anchor=(-1, -1), iterations=1,
borderType=lmc_cv.BORDER_DEFAULT)
# Morphological Gradient
gradient_image = lmc_cv.morphologyEx(image, lmc_cv.MORPH_GRADIENT, kernel, anchor=(-1, -1), iterations=1,
borderType=lmc_cv.BORDER_DEFAULT)
# Top Hat
tophat_image = lmc_cv.morphologyEx(image, lmc_cv.MORPH_TOPHAT, kernel, anchor=(-1, -1), iterations=1,
borderType=lmc_cv.BORDER_DEFAULT)
# Black Hat
blackhat_image = lmc_cv.morphologyEx(image, lmc_cv.MORPH_BLACKHAT, kernel, anchor=(-1, -1), iterations=1,
borderType=lmc_cv.BORDER_DEFAULT)
# 显示图像
pyplot.figure('Image Display')
images = [image, erosion_image, dilation_image, opening_image, closing_image, gradient_image, tophat_image,
blackhat_image]
titles = ['Original', 'Erosion', 'Dilation', 'Opening', 'Closing', "Morphological Gradient", 'Top Hat', 'Black Hat']
for i in range(8):
pyplot.subplot(2, 4, i + 1)
pyplot.imshow(images[i], 'gray')
pyplot.title(titles[i])
pyplot.xticks([])
pyplot.yticks([])
pyplot.show()
# 根据用户输入保存图像
if ord("q") == (lmc_cv.waitKey(0) & 0xFF):
# 销毁窗口
pyplot.close()
return