形态学,即数学形态学(mathematical Morphology),是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质〈最具区分能力-most discriminative)的形状特征,如边界和连通区域等。同时像细化、像素化和修剪毛刺等技术也常应用于图像的预处理和后处理中,成为图像增强技术的有力补充。(选自https://blog.csdn.net/guanzhen3657/article/details/81324310)
腐蚀与膨胀的功能:消除噪声;分割出独立的图像元素,在图像中连接相邻元素;寻找图像中明显的极大值或极小值区域;求出图像的梯度。
注:1、形态学操作是对白色部分而言的,不是黑色部分。
2、可以对彩色图像进行处理。
3、开操作、闭操作、形态梯度、 顶帽、 黑帽函数相同,只是op (形态操作的类型)不同。
卷积核沿着图像滑动,如果与卷积核所对应额原图像的所有像素值都是1,那么中心元素就保持原来的像素值,否则就变为0。
处理图像后,图像白色区域会减少。
关键代码
void erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )
src - 输入图像; 通道数可以是任意的,但深度应该是CV_8U,CV_16U,CV_16S, CV_32F` 或 ``CV_64F之一。
dst - 输出与src相同大小和类型的图像。
kernel - 用于侵蚀的结构元素; 如果 element = Mat(),则使用 3 x 3 矩形结构元素。可以使用getStructuringElement()创建内核。
anchor - 锚中元素的位置; 默认值 (-1, -1) 表示锚点位于元素中心。
迭代次数 - 应用侵蚀的次数。
borderType - 像素外推方法(有关详细信息,请参阅 borderInterpolate)。
borderValue - 边框常量的边框值
示例
erode(res, out, element, Point(-1, -1),
iterations = 6,
borderType = BORDER_CONSTANT); //此操作共进行了6次腐蚀
关键代码
cv2.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst
示例
erosion = cv2.erode(res,kernel,iterations = 1)
与卷积核对应的原图像的像素值只要有一个是1,中心元素的像素值就是1.
增加图像中白色区域。
关键代码
void dilate(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )
src - 输入图像; 通道数可以是任意的,但深度应该是CV_8U,CV_16U,CV_16S, CV_32F` 或 ``CV_64F之一。
dst - 输出与src相同大小和类型的图像。
kernel - 用于扩张的结构元素; 如果 elemenat = Mat(),则使用 3 x 3矩形结构元素。可以使用getStructuringElement()创建内核
anchor- 锚中元素的位置; 默认值(-1, -1)表示锚点位于元素中心。
迭代 - 应用膨胀的次数。
borderType - 像素外推方法(有关详细信息,请参阅 borderInterpolate)。
borderValue - 边框常量的边框值
示例
dilate(image, out, element, Point(-1, -1),
iterations = 6,
borderType = BORDER_CONSTANT); //iterations=6,6是表示膨胀的次数,表示操作进行了6次膨胀
内联代码片
cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst
示例
dilation = cv2.dilate(res,kernel,iterations = 1)
先腐蚀再膨胀。
用于消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。
关键代码
void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )
src - 源图像。通道数可以是任意的。深度应为CV_8U,CV_16U,CV_16S, CV_32F` 或 ``CV_64F之一。
dst - 与src具有相同大小和类型的目标映像 。
kernel - 结构元素。它可以使用getStructuringElement()创建。
anchor - 与内核的锚点位置。负值意味着锚位于核心中心。
op -形态操作的类型可以是以下之一:
MORPH_OPEN - 开场操作
MORPH_CLOSE - 结算操作
MORPH_GRADIENT - 形态梯度
MORPH_TOPHAT - “大礼帽”
MORPH_BLACKHAT - “黑帽子”
iterations - 应用侵蚀和膨胀的次数。
borderType - 像素外推法。有关详细信息,请参阅 borderInterpolate。
borderValue - 边框常量的边框值。默认值具有特殊含义。
示例
morphologyEx(img, out, MORPH_OPEN, element);
关键代码
cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst
示例
opening = cv2.morphologyEx(res, cv2.MORPH_OPEN, kernel)
先膨胀后腐蚀。
用于排除小型黑洞。
关键代码
void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )
src - 源图像。通道数可以是任意的。深度应为CV_8U,CV_16U,CV_16S, CV_32F` 或 ``CV_64F之一。
dst - 与src具有相同大小和类型的目标映像 。
kernel - 结构元素。它可以使用getStructuringElement()创建。
anchor - 与内核的锚点位置。负值意味着锚位于核心中心。
op -形态操作的类型可以是以下之一:
MORPH_OPEN - 开场操作
MORPH_CLOSE - 结算操作
MORPH_GRADIENT - 形态梯度
MORPH_TOPHAT - “大礼帽”
MORPH_BLACKHAT - “黑帽子”
iterations - 应用侵蚀和膨胀的次数。
borderType - 像素外推法。有关详细信息,请参阅 borderInterpolate。
borderValue - 边框常量的边框值。默认值具有特殊含义。
示例
morphologyEx(img, out, MORPH_CLOSE, element);
关键代码
cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst
示例
closing = cv2.morphologyEx(res, cv2.MORPH_CLOSE, kernel)
膨胀图与腐蚀图只差。
用于将团块的边缘突出出来,我们可以用形态学梯度来保留物体的边缘轮廓。
关键代码
void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )
src - 源图像。通道数可以是任意的。深度应为CV_8U,CV_16U,CV_16S, CV_32F` 或 ``CV_64F之一。
dst - 与src具有相同大小和类型的目标映像 。
kernel - 结构元素。它可以使用getStructuringElement()创建。
anchor - 与内核的锚点位置。负值意味着锚位于核心中心。
op -形态操作的类型可以是以下之一:
MORPH_OPEN - 开场操作
MORPH_CLOSE - 结算操作
MORPH_GRADIENT - 形态梯度
MORPH_TOPHAT - “大礼帽”
MORPH_BLACKHAT - “黑帽子”
iterations - 应用侵蚀和膨胀的次数。
borderType - 像素外推法。有关详细信息,请参阅 borderInterpolate。
borderValue - 边框常量的边框值。默认值具有特殊含义。
示例
morphologyEx(img, out, MORPH_GRADIENT, element);
关键代码
cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst
示例
closing = cv2.morphologyEx(res, cv2.MORPH_GRADIENT, kernel)
原图像与开运算得到的图像的差。
关键代码
void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )
src - 源图像。通道数可以是任意的。深度应为CV_8U,CV_16U,CV_16S, CV_32F` 或 ``CV_64F之一。
dst - 与src具有相同大小和类型的目标映像 。
kernel - 结构元素。它可以使用getStructuringElement()创建。
anchor - 与内核的锚点位置。负值意味着锚位于核心中心。
op -形态操作的类型可以是以下之一:
MORPH_OPEN - 开场操作
MORPH_CLOSE - 结算操作
MORPH_GRADIENT - 形态梯度
MORPH_TOPHAT - “大礼帽”
MORPH_BLACKHAT - “黑帽子”
iterations - 应用侵蚀和膨胀的次数。
borderType - 像素外推法。有关详细信息,请参阅 borderInterpolate。
borderValue - 边框常量的边框值。默认值具有特殊含义。
示例
morphologyEx(img, out, MORPH_TOPHAT, element);
关键代码
cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst
示例
closing = cv2.morphologyEx(res, cv2.MORPH_TOPHAT, kernel)
进行闭运算与原始图像的差。
关键代码
void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )
src - 源图像。通道数可以是任意的。深度应为CV_8U,CV_16U,CV_16S, CV_32F` 或 ``CV_64F之一。
dst - 与src具有相同大小和类型的目标映像 。
kernel - 结构元素。它可以使用getStructuringElement()创建。
anchor - 与内核的锚点位置。负值意味着锚位于核心中心。
op -形态操作的类型可以是以下之一:
MORPH_OPEN - 开场操作
MORPH_CLOSE - 结算操作
MORPH_GRADIENT - 形态梯度
MORPH_TOPHAT - “大礼帽”
MORPH_BLACKHAT - “黑帽子”
iterations - 应用侵蚀和膨胀的次数。
borderType - 像素外推法。有关详细信息,请参阅 borderInterpolate。
borderValue - 边框常量的边框值。默认值具有特殊含义。
示例
morphologyEx(img, out, MORPH_BLACKHAT, element);
关键代码
cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst
示例
closing = cv2.morphologyEx(res, cv2.MORPH_BLACKHAT, kernel)
python
import cv2
import numpy as np
img = cv2.imread('github1.jpg')
res = cv2.resize(img,(400, 400), interpolation = cv2.INTER_CUBIC)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(res,kernel,iterations = 1)
dilation = cv2.dilate(res,kernel,iterations = 1)
opening = cv2.morphologyEx(res, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(res, cv2.MORPH_CLOSE, kernel)
gradient = cv2.morphologyEx(res, cv2.MORPH_GRADIENT, kernel)
tophat = cv2.morphologyEx(res, cv2.MORPH_TOPHAT, kernel)
blackhat = cv2.morphologyEx(res, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow("res", res)
cv2.imshow("erosion", erosion)
cv2.imshow("dilation", dilation)
cv2.imshow("opening", opening)
cv2.imshow("closing", closing)
cv2.imshow("gradient", gradient)
cv2.imshow("tophat", tophat)
cv2.imshow("blackhat", blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()