OpenCV Python 形态学操作-膨胀、腐蚀、开运算、闭运算
【目标】
- 膨胀
- 腐蚀
- 开运算
- 闭运算
【代码】
两个基本的操作是腐蚀和膨胀;
腐蚀:对前景边缘进行腐蚀,在原图中,只有像素结构与核
一致时为1(保留)
,否则为0(腐蚀)
。前景变小,可以用于消除那些小的白点,运动检测的blob
中经常使用,还可以用于分离两个连通的对象。
膨胀:与腐蚀相反,在核
下,如果有像素为1
,则为1
。白色区域会变大,但同时噪声也会更加明显。所以常与腐蚀一起使用,先腐蚀后膨胀,消除噪声后,恢复原来图像的前景大小。
开运算:先腐蚀后膨胀
闭运算:先膨胀后腐蚀
形态学梯度:膨胀与腐蚀的差值图像
顶帽:输入图像与开运算图像的差值图像
黑帽:输入图像与闭运算图像的差值图像
import cv2
import numpy as np
img = cv2.imread('hui2.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
dilation = cv2.dilate(img,kernel,iterations = 1)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow("src", img)
cv2.imshow("erosion", erosion)
cv2.imshow("dilation", dilation)
cv2.imshow("opening", opening)
cv2.imshow("closing", closing)
cv2.imshow("gradient", gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
img = cv2.imread('hui2.png',0)
kernel = np.ones((5,5),np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow("tophat", tophat)
cv2.imshow("blackhat", blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()
各类型形态学操作核的示意
- MORPH_RECT @ 5x5
[[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]]
- MORPH_ELLIPSE @ 5x5
[[0 0 1 0 0]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[0 0 1 0 0]]
- MORPH_CROSS @ 5x5
[[0 0 1 0 0]
[0 0 1 0 0]
[1 1 1 1 1]
[0 0 1 0 0]
[0 0 1 0 0]]
【接口】
- erode
void cv::erode ( InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar & borderValue = morphologyDefaultBorderValue()
);
cv2.erode( src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] ) -> dst
利用特殊的结构元素腐蚀图像
- src: 原始图像
- dst: 结果图像
- kernel: 结构元素
- anchor: 默认为(-1, -1), 结构元素的中心,可以设置不同的锚点
- iterations: 腐蚀次数
- borderType: 边缘类型,BORDER_WRAP 不支持
- borderValue: 边缘填充的像素值
- dilation
void cv::dilate ( InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar & borderValue = morphologyDefaultBorderValue()
);
cv2.dilate( src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] ) -> dst
利用特殊的结构元素膨胀图像
- src: 原始图像
- dst: 结果图像
- kernel: 结构元素
- anchor: 默认为(-1, -1), 结构元素的中心,可以设置不同的锚点
- iterations: 膨胀次数
- borderType: 边缘类型,BORDER_WRAP 不支持
- borderValue: 边缘填充的像素值
- morphologyEx
void cv::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()
);
cv2.morphologyEx( src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] ) -> dst
利用特殊的结构元素进行形态学操作
- src: 原始图像
- dst: 结果图像
- op: 操作类型
- kernel: 结构元素
- anchor: 默认为(-1, -1), 结构元素的中心,可以设置不同的锚点
- iterations: 形态学次数
- borderType: 边缘类型,BORDER_WRAP 不支持
- borderValue: 边缘填充的像素值
-
MorphTypes
-
BorderTypes