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

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

BorderTypes

【参考】

  1. OpenCV官方文档
  2. Morphology

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄金旺铺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值