图像阈值化是图像分割的方法,而分割本身是将图像按强度、颜色或者任何其他图像属性区分为不同的相关像素组的过程。
OpenCV中有两个最基本的图像分割方法:threshold、adaptiveThreshold。
一、threshold
OpenCV API:
ret, dst = cv2.threshold(src, thresh, maxval, type)
参数:
- src:输入的图像(只能为单通道图像,例如灰度图)
- thresh:阈值。通过阈值水平的像素被接受,不通过的则不接受。
- maxVal:方法中用到的阈值。
- type:二值化操作的类型,包含以下5种类型:
方法 说明 cv2.THRESH_BINARY 超过阈值的像素设置为maxVal,不超过的设置为0 cv2.THRESH_BINARY_INV 不超过阈值的像素设置为maxVal,超过的设置为0 cv2.THRESH_TRUNC 超过阈值的设为thresh cv2.THRESH_TOZERO 低于阀值的设为0 cv2.THRESH_TOZERO_INV 低于阀值的设为maxVal
返回值:
- ret:用于阈值化的值,等同于thresh
- dst:阈值化后生成的图像
代码编写
下面,我们用阈值函数筛选出图像中接近黑色的像素
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
src = cv.imread("E:\\qi.png")
img = src.copy()
# 1. BGR->GRAY
# 2. 图像阈值化(小于60接受,并且设置为maxVal,不接受的设置为0)
# 3. GRAY->BGR
img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, dst = cv.threshold(img, 60, 255, cv.THRESH_BINARY_INV)
dst = cv.cvtColor(dst, cv.COLOR_GRAY2BGR)
# 显示图像
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(src[:, :, ::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:, :, ::-1])
axes[1].set_title("结果")
plt.show()
二、 adaptiveThreshold
该函数用来对灰度图应用自适应阈值,取决于传递给它的自适应方法。
该函数可以单独地、自动地计算每个像素的阈值,但仍需要传递几个参数,包括最大阈值,块大小(可以是3、5、7等)以及一个将从计算得到的块均值中减去的常量值,该值可以为0。
OpenCV API:
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
参数:
- src,maxValue,threshType等同于上文中的(src,maxVal,type)。
- adaptiveMethod:包含以下2种类型:
- cv2.ADAPTIVE_THRESH_MEAN_C
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C
- blockSize:图片分块的大小
- C:常量值
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
src = cv.imread("E:\\qi.png")
img = src.copy()
# 1. BGR->GRAY
# 2. 自适应阈值化
# 3. GRAY->BGR
img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
dst = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C
, cv.THRESH_BINARY_INV, 7, 0)
dst = cv.cvtColor(dst, cv.COLOR_GRAY2BGR)
# 显示图像
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(src[:, :, ::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:, :, ::-1])
axes[1].set_title("结果")
plt.show()