【OpenCV-Python】教程:3-5 形态学操作,腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度

OpenCV Python 形态学操作-膨胀、腐蚀、开运算、闭运算

【目标】

  • 膨胀
  • 腐蚀
  • 开运算
  • 闭运算

【代码】

【OpenCV-Python】教程:3-5 形态学操作,腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度_第1张图片

两个基本的操作是腐蚀膨胀
腐蚀:对前景边缘进行腐蚀,在原图中,只有像素结构与一致时为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()

【OpenCV-Python】教程:3-5 形态学操作,腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度_第2张图片

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
    【OpenCV-Python】教程:3-5 形态学操作,腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度_第3张图片

  • BorderTypes

见 BorderTypes

【参考】

  1. OpenCV官方文档
  2. Morphology

【OpenCV-Python】教程:3-5 形态学操作,腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度_第4张图片

你可能感兴趣的:(#,OpenCV,#,Python,opencv,python)