Opencv学习笔记(六)图像形态学处理

形态学变换

形态学处理主要应用于二值图像,目的是微调分割区域的形状,获得比较理想的目标图像。腐蚀和膨胀是形态学处理的基础操作,其他操作包括:开运算、闭运算、顶帽,黑帽。

主要操作

腐蚀:把前景物体的边界向内缩小。
cv2.erode():第一个参数为图像;第二个是结构元;第三个参数为锚点,默认为结构元的中心点;第四个参数为迭代次数。
膨胀:把前景物体的边界向外扩张。
cv2.dilate():第一个参数为图像;第二个是结构元;第三个参数为锚点,默认为结构元的中心点;第四个参数为迭代次数。
cv2.morphologyEx()函数
cv2.morphologyEx():第一个参数为图像;第二个参数为形态学运算,
cv2.MORPH_OPEN:开运算
cv2.MORPH_RECT: 闭运算
cv2.MORPH_GRADIENT:形态学梯度
cv2.MORPH_TOPHAT: 顶帽
cv2.MORPH_BLACKHAT:黑帽(底帽)
第三个参数为结构元; 第四个参数为结构元的锚点(默认中心点);第五个参数为迭代次数。
开运算:图像先腐蚀后膨胀。目的是消除毛刺、噪声,在纤细点处分离前景物体。
闭运算:图像先膨胀后腐蚀。目的是消除空洞,连接临近前景物体。
形态学梯度:图像的膨胀结果减去腐蚀结果,得到图像中物体的轮廓边界。
顶帽:图像和开运算图像的差。
黑帽:图像和闭运算图像的差。
结构元
OpenCV使用cv2.getStructuringElement()函数构造结构元,第一个参数为结构元的形状,
cv2.MORPH_RECT:矩形结构元
cv2.MORPH_RECT: 椭圆形结构元
cv2.MORPH_RECT:十字型结构元
第二个参数为结构元的大小:第三个参数为结构元的锚点(默认中心点)。

代码

import cv2
from matplotlib import pyplot as plt
# src = cv2.imread(r'F:\OPENCV\Opencv\test.png', cv2.IMREAD_COLOR)
src = plt.imread(r'F:\OPENCV\Opencv\test.png')
if src is None:
    print('input image is empty')
blur = cv2.medianBlur(src, 5)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray * 255, 127, 255, cv2.THRESH_BINARY)
# set element
element = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
# eroison
erosion = cv2.erode(gray, element, iterations=1)
# dilation
dilation = cv2.dilate(gray, element, iterations=1)
# opening  operation
opening = cv2.morphologyEx(gray, cv2.MORPH_OPEN, element)
# closing operation
closing = cv2.morphologyEx(gray, cv2.MORPH_RECT, element)
# morphology gradient operation
gradient = cv2.morphologyEx(gray, cv2.MORPH_GRADIENT, element)
# tophat
tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, element)
# blackhat
blackhat = cv2.morphologyEx(gray, cv2.MORPH_BLACKHAT, element)

# 显示各个图像
titles = ['src', 'gray', 'thresh', 'erosion', 'dilation', 'open', 'close', 'gradient', 'tophat', 'blaclhat']
images = [src, gray, thresh, erosion, dilation, opening, closing, gradient, tophat, blackhat]
plt.figure()
for i in range(len(images)):
    plt.subplot(3, 4, i + 1)
    plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([])
    plt.yticks([])
plt.savefig(r'F:\OPENCV\Opencv\test_morphology.png', dpi=200)
plt.show()

结果显示
在这里插入图片描述

参考

1.OpenCV-Python官方教程
2.OpenCV算法精解

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值