6. 形态学
6.1 形态学概述
- 什么是形态学
- 指一系列处理图像形状特征的图像处理技术
- 形态学的基本思想是利用一种特殊的结构元(本质上就是卷积核)来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别。
- 这些处理方法基本是对二进制图像进行处理, 即黑白图像
- 卷积核决定着图像处理后的效果
- 形态学常用基本操作有:
- 膨胀和腐蚀
- 开运算
- 闭运算
- 顶帽
- 黑帽
6.2 图像全局二值化
-
二值化: 将图像的每个像素变成两种值, 比如0, 255.
-
threshold(src, thresh, maxval, type[, dst])
-
src 最好是灰度图
-
thresh: 阈值
-
maxval: 最大值, 最大值不一定是255
-
type: 操作类型. 常见操作类型如下:
import cv2 import numpy as np img = cv2.imread('./dog.jpeg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 返回两个结果, 一个是阈值, 另一个是处理后的图片 ret, dst = cv2.threshold(gray, 80, 255, cv2.THRESH_BINARY) cv2.imshow('dog', np.hstack((gray, dst))) cv2.waitKey(0) cv2.destroyAllWindows()
-
6.3 自适应阈值二值化
在前面的部分我们使用是全局阈值,整幅图像采用同一个数作为阈值。当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。
adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
这种方法需要我们指定六个参数,返回值只有一个。
• Adaptive Method- 指定计算阈值的方法。
– cv2.ADPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平均值
– cv2.ADPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域的加权和,权重为一个高斯窗口。
• Block Size - 邻域大小(用来计算阈值的区域大小)。
• C - 这就是是一个常数,阈值就等于的平均值或者加权平均值减去这个常数。
# 因为光线问题, 全局二值化导致有部分地方看不见了.这时就需要自适应阈值二值化了.
import cv2
import numpy as np
img = cv2.imread('./math.png')
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 1920, 1080)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 自适应阈值二值化只返回一个值, 即二值化后的结果
dst = cv2.adaptiveThreshold(gray