1.形态学操作
OpenCV 提供了丰富的函数来进行形态学操作,包括腐蚀、膨胀、开运算、闭运算等。下面介绍一些常用的 OpenCV 形态学操作函数:
- 腐蚀操作(Erosion):
erode(src, dst, kernel, anchor, iterations, borderType, borderValue)
该函数对输入图像中的前景区域进行腐蚀操作,通过用结构元素中的最小值替换区域中的像素值来收缩前景区域。 - 膨胀操作(Dilation):
dilate(src, dst, kernel, anchor, iterations, borderType, borderValue)
该函数对输入图像中的前景区域进行膨胀操作,通过用结构元素中的最大值替换区域中的像素值来扩展前景区域。 - 开运算(Opening):
morphologyEx(src, dst, MORPH_OPEN, kernel, anchor, iterations, borderType, borderValue)
开运算是先对图像进行腐蚀操作,然后再进行膨胀操作。这个操作可以去除小的噪声,并平滑图像的边界。 - 闭运算(Closing):
morphologyEx(src, dst, MORPH_CLOSE, kernel, anchor, iterations, borderType, borderValue)
闭运算是先对图像进行膨胀操作,然后再进行腐蚀操作。这个操作可以填充小的空洞,并平滑图像的边界。 - 梯度运算(Gradient):
morphologyEx(src, dst, MORPH_GRADIENT, kernel, anchor, iterations, borderType, borderValue)
梯度运算可以通过对输入图像的膨胀和腐蚀结果之差来突出显示边缘。 - 顶帽运算(Top Hat):
morphologyEx(src, dst, MORPH_TOPHAT, kernel, anchor, iterations, borderType, borderValue)
顶帽运算可以通过对输入图像和开运算结果之差来突出显示边缘和细节。 - 黑帽运算(Black Hat):
morphologyEx(src, dst, MORPH_BLACKHAT, kernel, anchor, iterations, borderType, borderValue)
黑帽运算可以通过对闭运算结果和输入图像之差来突出显示边缘和细节。
以上函数中,src
是输入图像,dst
是输出图像,kernel
是结构元素,anchor
是结构元素的锚点位置,iterations
是迭代次数,borderType
是边界像素处理方式,borderValue
是边界像素的值。
2.相关函数morphologyEx()
morphologyEx() 是 OpenCV 库中用于形态学操作的函数之一。它可以执行包括腐蚀、膨胀、开运算、闭运算等一系列形态学操作。该函数的原型如下:
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:输入图像或图像数组。
- dst:输出图像或图像数组。
- op:指定形态学操作的类型。
- kernel:结构元素(核)用于形态学操作。
- anchor:结构元素中心的位置,默认为(-1, -1)表示结构元素的中心位置为核的中心。
- iterations:执行形态学操作的迭代次数,默认为1。
- borderType:边界像素处理方式,默认为BORDER_CONSTANT。
- borderValue:当borderType为BORDER_CONSTANT时指定边界像素的值,默认为morphologyDefaultBorderValue()。
其中形态学操作的类型:
3.示例代码:
void image_morphologyEx(Mat image){ Mat gray; cvtColor(image,gray,COLOR_BGR2GRAY);//灰度化 threshold(gray,gray,80,255,THRESH_BINARY); //5×5矩阵结构元素 Mat kernel= getStructuringElement(0,Size(5,5)); Mat open,close,gradient,tophat,blackhat; //对图像进行开运算 morphologyEx(gray,open,MORPH_OPEN,kernel); //对图像进行闭运算 morphologyEx(gray,close,MORPH_CLOSE,kernel); //对图像进行梯度运算 morphologyEx(gray,gradient,MORPH_GRADIENT,kernel); //对图像进行顶帽运算 morphologyEx(gray,tophat,MORPH_TOPHAT,kernel); //对图像进行黑帽运算 morphologyEx(gray,blackhat,MORPH_BLACKHAT,kernel); }