形态学转换是一些基于图像形状的简单操作。 它通常在二进制图像上执行。

1. 腐蚀、膨胀

腐蚀和膨胀是最基本的形态学操作。

1.1 腐蚀

腐蚀就是原图的高光区域被吃掉了,效果图的高光区域比原图小。 腐蚀的作用是消除物体的边界点,使目标变小,消除比结构元素小的噪声点。 腐蚀是寻找局部最小值的操作。

具体操作是:用一个结构元素扫描图像中的每个像素,将结构元素中的每个像素与它所覆盖的像素进行AND运算。 如果两者都为1,则像素为1,否则为0。 如下图,结构A被结构B腐蚀后:

python的OpenCV教案 opencv 4详解:基于python_opencv

cv.erode(img,kernel,iterations)

参数:

img 要处理的图像

kernel 核结构

iterations 腐蚀的次数,默认是1

1.2 膨胀

膨胀是将图像的高亮部分扩大,效果图比原图有更大的高亮区域。 膨胀的作用是将所有与物体接触的背景点合并到物体中,从而扩大目标,填补目标中的空洞。 膨胀是寻找局部最大值的操作。

具体操作是:用结构元素扫描图像中的每个像素,用结构元素中的每个像素与其覆盖的像素进行或运算。 如果两者都为0,则像素为0,否则为1。 如下图,结构A被结构B膨胀后:

python的OpenCV教案 opencv 4详解:基于python_python_02

cv.dilate(img,kernel,iterations)

参数:

img 要处理的图像

kernel 核结构

iterations 膨胀的次数,默认是1

例1:使用5*5的核结构对图中的字母进行腐蚀和膨胀操作。

python的OpenCV教案 opencv 4详解:基于python_python_03

import matplotlib
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

font = {
    "family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)

img = cv.imread("./image/letter.png")

# 创建核结构
kernel = np.ones((5, 5), np.uint8)

# 腐蚀
img1 = cv.erode(img, kernel)
plt.imshow(img1[:, :, ::-1])
plt.title("腐蚀")
plt.show()

# 膨胀
img2 = cv.dilate(img, kernel)
plt.imshow(img2[:, :, ::-1])
plt.title("膨胀")
plt.show()

输出:

python的OpenCV教案 opencv 4详解:基于python_高光区域_04

 

python的OpenCV教案 opencv 4详解:基于python_高光区域_05

2. 开运算、闭运算、礼帽运算、黑帽运算

2.1 开运算

开运算是先腐蚀后膨胀,它的作用是分离物体,消除小区域。

特点:消除噪声,去除小干扰块,而不影响原来的图像。

python的OpenCV教案 opencv 4详解:基于python_python_06

2.2 闭运算

闭运算与开运算相反,是先膨胀后腐蚀,作用是消除封闭物体上的孔洞。

特点:可以填充封闭区域。

python的OpenCV教案 opencv 4详解:基于python_高光区域_07

2.3 礼帽运算

礼帽运算的结果是原图像和图像的开运算的结果图像之间的差。

礼帽运算突出显示比原始图像轮廓周围区域更亮的区域,并用于分离比相邻区域更亮的斑点。 当一张图片的背景很大,小物体比较规则的时候,可以使用礼帽运算计算来提取背景。

2.4 黑帽运算

黑帽运算结果是原图像与图像的闭运算的结果图像之间的差。

黑帽运算后的效果图突出显示比原图轮廓周围区域更暗的区域,此操作与所选核的大小有关。黑帽运算用于分离比相邻点更暗的斑点。

cv.morphologyEx(img, op, kernel)
参数:
img 要处理的图像
op 处理方式:
cv.MORPH_OPEN 开运算
cv.MORPH_CLOSE 闭运算
cv.MORPH_TOPHAT 礼帽运算
cv.MORPH_BLACKHAT 黑帽运算
kernel 核结构

例2:使用10*10的核结构,对这个图像进行开运算和礼帽操作。

python的OpenCV教案 opencv 4详解:基于python_python的OpenCV教案_08

并对这个图像进行闭运算和黑帽操作。

python的OpenCV教案 opencv 4详解:基于python_python_09

import matplotlib
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

font = {
    "family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)

# 读取图像
open = cv.imread("./image/letteropen.png")
close = cv.imread("./image/letterclose.png")

# 设置运算核
kernel = np.ones((10, 10), np.uint8)

cvopen = cv.morphologyEx(open, cv.MORPH_OPEN, kernel)
plt.imshow(cvopen)
plt.title("开运算")
plt.show()

cvclose = cv.morphologyEx(close, cv.MORPH_CLOSE, kernel)
plt.imshow(cvclose)
plt.title("闭运算")
plt.show()

top = cv.morphologyEx(open, cv.MORPH_TOPHAT, kernel)
plt.imshow(top)
plt.title("礼帽")
plt.show()

black = cv.morphologyEx(close, cv.MORPH_BLACKHAT, kernel)
plt.imshow(black)
plt.title("黑帽")
plt.show()

输出:

python的OpenCV教案 opencv 4详解:基于python_python的OpenCV教案_10

python的OpenCV教案 opencv 4详解:基于python_python_11

python的OpenCV教案 opencv 4详解:基于python_黑帽_12

python的OpenCV教案 opencv 4详解:基于python_高光区域_13